Właściwy sposób na wdrożenie getExtensionAttributes ()


11

Zastanawiałem się, jaki jest właściwy sposób wdrożenia rozszerzalnego modelu EAV.

Widzę Magento\Catalog\Model\Product, że metoda getExtensionAttributes()jest implementowana w następujący sposób:

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

Ale w innych, takich jak modele klientów lub kategorii, jest to po prostu

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

co może prowadzić do wyniku NULL , jeśli klucz extension_attributes nie był wcześniej ustawiony.

Pragmatycznie wolałbym ten pierwszy. W ten sposób zawsze mogę uzyskać instancję Magento\Framework\Api\ExtensionAttributesInterface, nawet jeśli model został właśnie utworzony.

Ale dlaczego nie jest używany w innych modułach? Czy jest to sprzeczne z nową separacją modeli danych, którą widzimy w module klienta? Jeśli tak, to jak mamy zainicjować atrybuty rozszerzenia?

Odpowiedzi:


1

Magento aktualizowane the AbstractExtensibleObject :: _ metodę getExtensionAttributes wygenerować pusty obiekt, jeżeli ma atrybuty nie przedłużenie https://github.com/magento/magento2/commit/375132a81b95fafa4a03a17b72dbacdc90afa745#diff-56d044692f579051647a8284ff39cc0eR165 więc nigdy nie zwróci null. Nadal muszą jednak zaktualizować adnotację API, np. W vendor / magento / module-customer / Model / Data / Customer.php

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

2

Mogę częściowo odpowiedzieć na własne pytanie, ponieważ dowiedziałem się, że sposób implementacji metody Magento\Catalog\Model\Productjest zdecydowanie zły i może prowadzić do nieprzyjemnych błędów:

Jeśli nie ma extension_attributesjeszcze danych, tzn. _getExtensionAttributes()Zwraca null, metoda zwraca pustą instancję interfejsu atrybutów rozszerzenia.

Jest to dobre dla wypełnienia jawnej umowy i zapobiega błędom „Wywołaj funkcję członka przy zerowym”, ale zawsze zwraca nową pustą instancję, która nie wypełnia niejawnej umowy, a mianowicie, że otrzymuję kontener atrybutów rozszerzenia dla tej konkretnej instancji .

To znaczy:

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

wyjścia:

NULL

Lepsza implementacja wyglądałaby następująco:

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

Ale dlaczego nie jest używany w innych modułach? Czy jest to sprzeczne z nową separacją modeli danych, którą widzimy w module klienta? Jeśli tak, to jak mamy zainicjować atrybuty rozszerzenia?

Na to wciąż nie mam odpowiedzi



Czy kiedykolwiek uzyskałeś odpowiedź na to pytanie - lub jak najlepiej sobie z tym poradzić? Obecnie otrzymuję ten problem podczas rozszerzania obiektu zamówienia.
ol'bob dole

@ ol'bobdole, byłem coraz null $order->getExtensionAttributes() i został rozwiązany po kolejność uzyskanie jak poniżej: $order = $this->orderRepositoryInterface->get($order->getId());. Interfejs repozytorium zamówień to Magento\Sales\Api\OrderRepositoryInterface. Nie jestem pewien, czy twój problem był taki sam
Sarjan Gautam

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.