拡張子属性はMagento 2でどのように機能しますか?
-
13-12-2019 - |
質問
ドキュメントは言っています。
github link 1 と GitHUB LINK 2 。拡張属性を使用してそれらのインタフェースの1つに特定の属性を追加できますか?私は複雑な結合には興味がありません。 Scalar属性を追加するだけで、string
と入力します。
Data
インタフェースは、モデルのERM ...データへのゲートウェイです。そのため、システムを正しく使用するためにこれらのインタフェースの拡張機能がどのように機能するかを理解する必要があります。実際のモデルの代わりにparamとしてData
インターフェイスを頻繁に取得し、実際には大丈夫です。しかし、私は拡張機能がどのように機能するかについて少し混乱しています。
解決
拡張子属性はインタフェースを拡張する方法です。あなたがProductAttributeMediagallerEresentryIntryEntryIntryIntryIntryInterfaceに提供されている最初のリンクを例にしましょう。メソッドを見ると、このメソッド
があることがわかります。/**
* Retrieve existing extension attributes object or create a new one.
*
* @return \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryExtensionInterface|null
*/
public function getExtensionAttributes();
.
メモ@ Return型ProductAttributeMediagallerErestryExtensionInterface - ProductAttributeMediagalLeryEntryInterfaceの拡張属性を定義した場合に再生成されるインタフェースです(デフォルトではメソッドなしで空の空に生成されます)。登録した属性の名前は、インターフェイスのメソッドを作成するために使用されます。
type文字列のattr1を追加しましょう。インターフェイスが再生成された後にできることは、インターフェイスのインスタンスからアクセスすることです。
$entity = $objectManager->get('..\ProductAttributeMediaGalleryEntryInterface')
$entity->getExtensionAttributes()->getAttr1();
.
属性を設定するには、拡張属性インターフェイス
をインスタンス化する必要があります。$extension = $objectManager->get('..\ProductAttributeMediaGalleryEntryExtensionInterface')
$extension->setAttr1('value');
$entity->setExtensionAttributes($extension)
.
後者はデフォルトのシナリオであり、ExtensionInterfaceと親インターフェイスの実装方法によっては単純化される可能性があります。
[更新]
カスタム属性と拡張属性は異なる目的を処理します。
エンティティのeAv属性を表すためには、カスタム属性が必要です。ほとんどのeav属性は動的です:Magentoが管理UIを介してデプロイされた後に追加できます。そのため、EAV属性のコードの自動補完を取得できないのは便利です。
しかし、拡張開発者として、確かにいくつかの属性について知っています - 開発時に作成したもの。それはデータベース、関連データベース内のフィールド、またはeav属性の新しいフィールドにすることができます。 CodeBaseが変更されない限り、拡張子属性として登録できます。コードの自動補完を取得できます。
他のヒント
@eugenetulikaの回答を完了するには、/etc/extension_attributes.xmlを作成する必要があります。
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
<extension_attributes for="Magento\Catalog\Api\Data\ProductInterface">
<attribute code="attr1" type="string" />
</extension_attributes>
</config>
.
その後、以下のようにsetAttr1()メソッドであなたの新しいattriestを設定できます。
/** @var ProductExtension $extensionAttributes */
$extensionAttributes = $product->getExtensionAttributes();
$extensionAttributes->setAttr1('super data');
$product->setExtensionAttributes($extensionAttributes);
.
これが誰かに助けることができることを願っています:)
は