Richtiger Weg, um getExtensionAttributes () zu implementieren

11

Ich habe mich gefragt, wie man ein erweiterbares EAV-Modell richtig implementiert.

Ich sehe, dass in Magento\Catalog\Model\Product, die Methode getExtensionAttributes()wie folgt implementiert ist:

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

Aber in anderen, wie den Kunden- oder Kategoriemodellen, ist es einfach

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

Dies kann zu einem NULL- Ergebnis führen, wenn der Schlüssel extension_attributes noch nicht festgelegt wurde.

Pragmatisch würde ich den ersten vorziehen. Auf diese Weise kann ich immer sicher sein, eine Instanz von zu erhalten Magento\Framework\Api\ExtensionAttributesInterface, selbst wenn das Modell gerade instanziiert wurde.

Aber warum wird es dann nicht in anderen Modulen verwendet? Ist es gegen die neue Trennung von Datenmodellen, die wir im Kundenmodul sehen? Wenn ja, wie sollen wir die Erweiterungsattribute initialisieren?

Fabian Schmengler
quelle

Antworten:

1

Magento die AbstractExtensibleObject aktualisiert :: _ getExtensionAttributes Methode ein leeres Objekt zu erzeugen , wenn es keine Erweiterung hat Attribute https://github.com/magento/magento2/commit/375132a81b95fafa4a03a17b72dbacdc90afa745#diff-56d044692f579051647a8284ff39cc0eR165 , so dass es nie null zurück. Sie müssen die API-Annotation jedoch noch aktualisieren, z. B. in vendor / magento / module-customer / Model / Data / Customer.php

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

Ich kann meine eigene Frage teilweise beantworten, als ich herausfand, dass die Art und Weise, wie die Methode implementiert Magento\Catalog\Model\Productwird, definitiv falsch ist und zu bösen Fehlern führen kann:

Wenn noch keine extension_attributesDaten vorhanden sind, dh _getExtensionAttributes()null zurückgibt, gibt die Methode eine leere Instanz der Schnittstelle für Erweiterungsattribute zurück.

Dies ist gut, um den expliziten Vertrag zu erfüllen und verhindert "Aufruf einer Mitgliedsfunktion bei Null" -Fehlern, gibt jedoch immer eine neue leere Instanz zurück, die den impliziten Vertrag nicht erfüllt, nämlich, dass ich einen Erweiterungsattributcontainer für diese bestimmte Instanz erhalte .

Das bedeutet:

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

Ausgänge:

NULL

Eine bessere Implementierung würde folgendermaßen aussehen:

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

Aber warum wird es dann nicht in anderen Modulen verwendet? Ist es gegen die neue Trennung von Datenmodellen, die wir im Kundenmodul sehen? Wenn ja, wie sollen wir die Erweiterungsattribute initialisieren?

Darauf habe ich noch keine Antwort

Fabian Schmengler
quelle
Github-Problem: github.com/magento/magento2/issues/5979
Fabian Schmengler
Haben Sie jemals eine Antwort darauf bekommen - oder wie gehen Sie am besten damit um? Ich erhalte derzeit dieses Problem beim Erweitern eines Bestellobjekts.
Ol'Bob Dole
@ ol'bobdole, ich bekam NULL für $order->getExtensionAttributes() und wurde gelöst, nachdem ich die Bestellung wie folgt erhalten hatte : $order = $this->orderRepositoryInterface->get($order->getId());. Order Repository-Schnittstelle ist Magento\Sales\Api\OrderRepositoryInterface. Nicht sicher, ob Ihr Problem gleich war
Sarjan Gautam
0

Der Code wird in verschiedenen Erweiterungen unterschiedlich verwendet. Die Funktionalität wird verwendet, um ein beliebiges Attribut in dieser Schnittstelle zu binden. Weitere Informationen hierzu finden Sie unter folgendem Link: http://oyenetwork.com/articles/magento2-devliery-date-module-creation-from-scratch/


quelle
Dieser Artikel beantwortet meine Frage nicht. Ich weiß, wie man Erweiterungsattribute zu vorhandenen Entitäten hinzufügt. Ich habe speziell nach der Implementierung getExtensionAttributes()in benutzerdefinierten Entitäten gefragt
Fabian Schmengler