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();
}

これは、extension_attributesキーが以前に設定されていない場合、NULLの結果になる可能性があります

実用的には、最初の方を好みます。これによりMagento\Framework\Api\ExtensionAttributesInterface、モデルがインスタンス化されたばかりの場合でも、常にのインスタンスを確実に取得できます。

しかし、なぜそれが他のモジュールで使用されないのですか?カスタマーモジュールに表示されるデータモデルの新しい分離に反対ですか?もしそうなら、拡張属性をどのように初期化するべきですか?

回答:


1

Magentoのは、それに拡張子がない場合は空のオブジェクトを生成するAbstractExtensibleObject :: _ getExtensionAttributes方法は属性の更新 https://github.com/magento/magento2/commit/375132a81b95fafa4a03a17b72dbacdc90afa745#diff-56d044692f579051647a8284ff39cc0eR165を 、それがnullを返すことはありませんので。ただし、たとえば、vendor / magento / module-customer / Model / Data / Customer.phpのAPIアノテーションを更新する必要があります。

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

2

メソッドの実装方法がMagento\Catalog\Model\Product間違いであり、厄介なバグにつながる可能性があることがわかったので、自分の質問に部分的に回答することができます。

extension_attributesデータがまだない場合、つまり_getExtensionAttributes()nullを返す場合、メソッドは拡張属性インターフェースの空のインスタンスを返します。

これは、明示的なコントラクトを満たし、「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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.