Правильний спосіб реалізації getExtensionAttributes ()


11

Мені було цікаво, який правильний спосіб втілити розширювану модель EAV.

Я бачу, що в Magento\Catalog\Model\Product, метод getExtensionAttributes()реалізований так:

public function getExtensionAttributes()
{
    $extensionAttributes = $this->_getExtensionAttributes();
    if (!$extensionAttributes) {
        return $this->extensionAttributesFactory->create('Magento\Catalog\Api\Data\ProductInterface');
    }
    return $extensionAttributes;
}

Але в інших, як і модель клієнта чи категорії, це просто

public function getExtensionAttributes()
{
    return $this->_getExtensionAttributes();
}

що може призвести до NULL результату, якщо ключ extension_attributes не був встановлений раніше.

Прагматично я б віддав перевагу першому. Таким чином я завжди можу бути впевненим отримати екземпляр Magento\Framework\Api\ExtensionAttributesInterface, навіть якщо модель щойно була створена.

Але чому він тоді не використовується в інших модулях? Це проти нового роз'єднання моделей даних, яке ми бачимо в замовницькому модулі? Якщо так, то як ми повинні ініціалізувати атрибути розширення?

Відповіді:


1

Magento оновив метод AbstractExtensibleObject :: _ getExtensionAttributes для генерування порожнього об'єкта, якщо він не має атрибутів розширення https://github.com/magento/magento2/commit/375132a81b95fafa4a03a17b72dbacdc90afa745#diff-56d044692af . Вони все ще потребують оновлення приміток API, хоча, наприклад, у постачальника / magento / module-customer / Model / Data / Customer.php

 /**
 * {@inheritdoc}
 *
 * @return \Magento\Customer\Api\Data\CustomerExtensionInterface|null
 */
public function getExtensionAttributes()
{
    return $this->_getExtensionAttributes();
}

2

Я можу частково відповісти на власне запитання, оскільки дізнався, що спосіб реалізації методу Magento\Catalog\Model\Product, безумовно, неправильний і може призвести до неприємних помилок:

Якщо extension_attributesданих ще немає, тобто _getExtensionAttributes()повертає null, метод повертає порожній примірник інтерфейсу атрибутів розширення.

Це добре для виконання явного контракту і запобігає помилкам "Виклик до функції члена при нульовому", але він завжди повертає новий порожній екземпляр, який не виконує неявний контракт, а саме я отримую контейнер атрибутів розширення для цього конкретного екземпляра .

Це означає:

$product->getExtensionAttributes()->setStockItem($stockItem);
var_dump($product->getExtensionAttributes()->getStockItem());

Виходи:

NULL

Краща реалізація виглядала б так:

public function getExtensionAttributes()
{
    $extensionAttributes = $this->_getExtensionAttributes();
    if (!$extensionAttributes) {
        $extensionAttributes = $this->extensionAttributesFactory->create('Magento\Catalog\Api\Data\ProductInterface');
        $this->_setExtensionAttributes($extensionAttributes);
    }
    return $extensionAttributes;
}

Але чому він тоді не використовується в інших модулях? Це проти нового роз'єднання моделей даних, яке ми бачимо в замовницькому модулі? Якщо так, то як ми повинні ініціалізувати атрибути розширення?

На це я досі не маю відповіді



Ви коли-небудь отримували відповідь на це - або як найкраще впоратися з цим? Зараз у мене виникає ця проблема під час розширення об’єкта замовлення.
ol'bob dole

@ Ol'bobdole, я отримую NULL для $order->getExtensionAttributes() і було вирішено після отримання замовлення , як показано нижче: $order = $this->orderRepositoryInterface->get($order->getId());. Інтерфейс сховища замовлень є Magento\Sales\Api\OrderRepositoryInterface. Не впевнений, чи було ваше питання таким самим
Сарджан Гаутам

0

Код використовується по-різному в різних розширеннях. Функціональність використовується для прив'язки будь-якого атрибуту в цьому інтерфейсі. Щоб краще зрозуміти це, перейдіть за цим посиланням: http://oyenetwork.com/articles/magento2-devliery-date-module-creation-from-scratch/


Ця стаття не відповідає на моє запитання. Я знаю, як додати атрибути розширення до існуючих сутностей, я спеціально запитував про реалізацію getExtensionAttributes()в спеціальних сутностях
Fabian Schmengler
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.