引用アイテムなどの拡張属性を使用して、頭を包み込みたいと思います。
Magento 1のようなセットアップクラスを使用して、このようなエンティティにカスタム属性を追加しても問題ありません。これはこの質問の目的ではありません。
現時点では、エンティティAPIを介して拡張機能によって拡張属性として追加されたこのような属性を公開したいときに、この魔法に圧倒されます。
更新:通常のファクトリがどのように生成されるかを知っています。この質問は、生成された拡張属性インターフェースの生成された実装をインスタンス化する特別なファクトリーに関するものです。
これを機能させるために私がとるステップは次のとおりです。私はこれらを追加するので、答えようとする人は誰でもそれらの詳細に入る必要はありません。
私の質問はどのようにか、なぜそれが動作します。
エンティティAPIを介して拡張属性を公開する手順:
etc/extension_attributes.xml
エンティティインターフェイスに属性を追加するを作成します- エンティティ
ExtensionAttributes
インスタンスに属性値を追加するプラグインを作成します。
2番目のポイントを実行するには、エンティティExtensionAttributes
インスタンスが必要です。このため、プラグインはファクトリに依存します。ファクトリは、オブジェクトマネージャがDIを介して提供します。
見積品目の例Magento\Quote\Api\Data\CartItemExtensionFactory
を使用する必要があります。
私はこの工場のタイプが何らかの形で生成魔法の引き金になっているに違いないと思います。
その後、Magentoは\Magento\Quote\Api\Data\CartItemExtensionInterface
、すべての拡張属性のセッターとゲッターとの一致するインターフェースを生成します。
ただし、そのインターフェイスの具体的な実装は生成されないようです。少なくともPHPStormはそれを見ていません。
Magentoは、クラスを生成するために必要な情報をどのように収集しますか?生成されたインターフェイスメソッドは、具体的なインスタンスでどのように呼び出すことができますか?メモリのみで生成されるクラスですか?
私はそれが機能することを嬉しく思いますが、それは本当に満足のいくものではありません。拡張機能によって自動的に作成された属性を使用するMagentos機能は、その成功の重要な要因の1つです。モジュール開発者として、プロセス全体を完全に理解する必要があると思います。
時間があれば、自分でこれを掘り下げたいと思いますが、説明が得られればいいと思います。
UPDATE 2:通読するために少し時間がかかった\Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator
と\Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator
。今、私は少なくとも何が起こっているのか大まかな考えを持っています。誰も私に勝てない場合、私はそれが有用な参考になると思うので、ある時点で完全なプロセスの説明を書きます。