Magento 2 物件與 extension attributes(上)
使用 extension attributes 可提昇 Magento 2 物件的延展性,對於公用模組的開發更是可以提昇模組的實用性與彈性,讓模組可以更容易配合不同專案的邏輯變化。
從這篇文章你會知道:
- extension attributes 的用途
- 如何定義一個可使用 extension attributes 的物件
- Entity與extension attributes的CRUD整合
延伸閱讀:
Magento 2 物件與extension attributes(下)
為什麼要使用 extension attributes?
工程師在延伸第三方模組時,常遇到需要將額外的資料帶入該模組的某個 entity, 但沒有適當的 API 可供使用。 因此,當我們在開發模組時,若預想到此 entity 會有被延伸、塞入額外資料的需求,可考慮套用 extension attribute 的屬性。往後,其他專案工程師只要將資料宣告為該 entity 的 extension attributes, 並定義好資料存取邏輯,就可以輕鬆處理資料CRUD了。
如何將我的物件定義為可使用 extension attributes 的物件?
Entity Interface 需要 extend \Magento\Framework\Api\ExtensibleDataInterface.
use Magento\Framework\Api\ExtensibleDataInterface; interface EntityInterface extends ExtensibleDataInterface { }
Entity Class 需要 extend 並實作 getExtensionAttributes() 和 setExtensionAttributes()
/** * Retrieve existing extension attributes object or create a new one. * * @return \AstralWeb\Example\Api\Data\EntityExtensionInterface|null */ public function getExtensionAttributes(); /** * @param \Magento\Framework\Api\ExtensionAttributesInterface $extensionAttributes * @return $this */ public function setExtensionAttributes(ExtensionAttributesInterface $extensionAttributes);
這時候 IDE 或許會出現警告表示不存在 \AstralWeb\Example\Api\Data\EntityExtensionInterface , 只要執行 bin/magento setup:di:compile 就會在 generated/ 底下自動產生出這個檔案了。
Entity 與 extension attributes 的 CRUD 整合
以上,很基本的一個 extension attribute entity 就完成了。只要使用 extension_attributes.xml 就可以給這個 entity 定義一個新的 extension attribute. 但這仍是一個不好延伸的 entity. 第三方開發者得先釐清此 entity 的 CRUD 邏輯,再用 plugin 或 preference 的方式插入其新增的 attribute 的 CRUD 邏輯。
為了再提高此 entity 的延展性,可以在 entity 的 Management Class (例如 Repository) 導入 Magento 提供的 EntityManager CRUD Operations 物件。以 Read Operation 為例,先導入 ReadExtensions 的物件:
/** @var \Magento\Framework\EntityManager\Operation\Read\ReadExtensions $readExtensions */ protected $readExtensions;
然後,在讀取物件的邏輯中加入以下:
/** @var \AstralWeb\Example\Model\Entity $item */ $item = $this->readExtensions->execute($item);
往後,其他開發者可將自己的 extension attributes 讀取邏輯撰寫成一個實作 \Magento\Framework\EntityManager\Operation\ExtensionInterface 的 class, 並用 di 的方式插入 Magento\Framework\EntityManager\Operation\ExtensionPool 即可確保讀取 entity 時都能一起讀取到該 extension attribute.
以上就是歐斯瑞本次 Magento 2 物件與 extension attributes 的分享
關於 extension attribute 更詳細的應用與注意事項,敬請期待下篇的介紹!
訂閱歐斯瑞的電子報、追蹤臉書粉絲團及IG,收到更多相關實用資訊!也歡迎與我們聯繫。
〖參考資料來源〗:
我要留言