Modo giusto per implementare getExtensionAttributes ()


11

Mi chiedevo, qual è il modo giusto per implementare un modello EAV estensibile.

Vedo che in Magento\Catalog\Model\Product, il metodo getExtensionAttributes()è implementato in questo modo:

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

Ma in altri, come i modelli dei clienti o delle categorie, è giusto

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

che può portare a un risultato NULL , se la chiave extension_attributes non è stata impostata prima.

Pragmaticamente, preferirei il primo. In questo modo posso sempre essere sicuro di ottenere un'istanza di Magento\Framework\Api\ExtensionAttributesInterface, anche se il modello è stato appena istanziato.

Ma allora perché non viene utilizzato in altri moduli? È contro la nuova separazione dei modelli di dati che vediamo nel modulo del cliente? In tal caso, come dovremmo inizializzare gli attributi dell'estensione?

Risposte:


1

Magento ha aggiornato l'AbstractExtensibleObject :: _ metodo getExtensionAttributes per generare un oggetto vuoto se non ha gli attributi di alcuna estensione https://github.com/magento/magento2/commit/375132a81b95fafa4a03a17b72dbacdc90afa745#diff-56d044692f579051647a8284ff39cc0eR165 in modo che non tornerà mai più nulla. Devono comunque aggiornare l'annotazione API, ad esempio in vendor / magento / module-customer / Model / Data / Customer.php

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

2

Posso parzialmente rispondere alla mia domanda poiché ho scoperto che il modo in cui il metodo è implementato Magento\Catalog\Model\Productè decisamente sbagliato e può portare a cattivi bug:

Se non ci sono ancora extension_attributesdati, ovvero _getExtensionAttributes()restituisce null, il metodo restituisce un'istanza vuota dell'interfaccia degli attributi di estensione.

Questo è utile per adempiere al contratto esplicito e impedisce errori "Chiamata a una funzione membro in caso di null", ma restituisce sempre una nuova istanza vuota, che non soddisfa il contratto implicito, ovvero che ottengo un contenitore di attributi di estensione per questa specifica istanza .

Questo significa:

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

uscite:

NULL

Una migliore implementazione sarebbe simile a questa:

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

Ma allora perché non viene utilizzato in altri moduli? È contro la nuova separazione dei modelli di dati che vediamo nel modulo del cliente? In tal caso, come dovremmo inizializzare gli attributi dell'estensione?

Per quello, non ho ancora una risposta



Hai mai avuto una risposta a questo - o come è meglio affrontarlo? Attualmente sto riscontrando questo problema durante l'estensione di un oggetto ordine.
Ol'bob Dole,

@ ol'bobdole, mi è stato sempre NULL per $order->getExtensionAttributes() ed è stato risolto dopo ordine ottenendo come di seguito: $order = $this->orderRepositoryInterface->get($order->getId());. L'interfaccia del repository degli ordini è Magento\Sales\Api\OrderRepositoryInterface. Non sono sicuro se il tuo problema fosse lo stesso
Sarjan Gautam,

0

Il codice viene utilizzato in modo diverso in varie estensioni. La funzionalità viene utilizzata per associare qualsiasi attributo in tale interfaccia. Per una migliore comprensione di questo, consultare questo link: http://oyenetwork.com/articles/magento2-devliery-date-module-creation-from-scratch/


Questo articolo non risponde alla mia domanda. So come aggiungere attributi di estensione a entità esistenti, stavo chiedendo in particolare l'implementazione getExtensionAttributes()in entità personalizzate
Fabian Schmengler
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.