Magento 2のDIプラグイン

Magento 2では、最初のバージョンで使用された書き換えの代わりに、3つの方法で実行フローをインターセプトすることにより、ほとんどのメソッドの動作をオーバーライドできるプラグインが登場しました。





プラグインの詳細については、 ドキュメントを参照してください。カットの下は使用例にすぎません。



挑戦する



エンドユーザーにとって、特定の倉庫を参照して製品数の会計が実行されることが重要であると仮定します。 データベースに新しいwarehouse



テーブルが作成され、倉庫内の製品の数量がwarehouse_item



テーブルに計上されます。ここで、主キーは倉庫識別子と製品識別子の組み合わせです。



 CREATE TABLE warehouse_item ( product_id ..., warehouse_id ..., qty ..., PRIMARY KEY (product_id, warehouse_id), ... )
      
      





したがって、管理パネルの製品グリッドでは、出力時に「数量」列( cataloginventory_stock_item.qty



)のデータを合計SUM(warehouse_item.qty)



SUM(warehouse_item.qty)



に置き換える必要があります。





既存のコードを分析すると、 Magento\Catalog\Ui\DataProvider\Product\ProductDataProvider



によって提供されるデータに基づいてグリッドが構築され、 Magento\Catalog\Ui\DataProvider\Product\ProductDataProvider



の量に関するデータがDI設定( magento/module-catalog-inventory/etc/adminhtml/di.xml



):



 <type name="Magento\Catalog\Ui\DataProvider\Product\ProductDataProvider"> <arguments> <argument name="addFieldStrategies" xsi:type="array"> <item name="qty" xsi:type="object">Magento\CatalogInventory\Ui\DataProvider\Product\AddQuantityFieldToCollection</item> </argument> ... </arguments> </type>
      
      





AddQuantityFieldToCollection



クラスのコードは次のAddQuantityFieldToCollection



です。



 namespace Magento\CatalogInventory\Ui\DataProvider\Product; ... class AddQuantityFieldToCollection implements AddFieldToCollectionInterface { public function addField(Collection $collection, $field, $alias = null) { $collection->joinField( 'qty', 'cataloginventory_stock_item', 'qty', 'product_id=entity_id', '{{table}}.stock_id=1', 'left' ); } }
      
      





つまり、 addField



メソッドが動作せず、 addField



から製品の量をコレクションに追加しないようにするには、 around



メソッドを使用してプラグインを使用して実行をインターセプトする必要があります。



プラグインの作成



DIセットアップ



プラグインをモジュールのDI構成( etc/adminhtml/di.xml



またはetc/adminhtml/di.xml



)に登録します。



 <?xml version="1.0"?> <config ...> <type name="Magento\CatalogInventory\Ui\DataProvider\Product\AddQuantityFieldToCollection"> <plugin name="vendor_module_plugin" type="Vendor\Module\Plugin\AddQuantityFieldToCollection" sortOrder="100" disabled="false"/> </type> </config>
      
      





プラグインコード



addField



メソッドの前後インターセプトのために、プラグインでaddField



メソッドを作成します。これは「 何もしません 」:



 namespace Vendor\Module\Plugin; use Magento\CatalogInventory\Ui\DataProvider\Product\AddQuantityFieldToCollection as Subject; class AddQuantityFieldToCollection { public function aroundAddField(Subject $subject, \Closure $proceed) { return; } }
      
      





生成されたクラス



生成されたファイル( ./var/generation/*



)をクリーニングし、管理WebUIを製品グリッドに切り替えた後、新しく作成された「インターセプター」のコードはファイル./var/generation/Magento/CatalogInventory/Ui/DataProvider/Product/AddQuantityFieldToCollection/Interceptor.php



にあります./var/generation/Magento/CatalogInventory/Ui/DataProvider/Product/AddQuantityFieldToCollection/Interceptor.php







 <?php namespace Magento\CatalogInventory\Ui\DataProvider\Product\AddQuantityFieldToCollection; /** * Interceptor class for @see * \Magento\CatalogInventory\Ui\DataProvider\Product\AddQuantityFieldToCollection */ class Interceptor extends \Magento\CatalogInventory\Ui\DataProvider\Product\AddQuantityFieldToCollection implements \Magento\Framework\Interception\InterceptorInterface { use \Magento\Framework\Interception\Interceptor; public function __construct() { $this->___init(); } /** * {@inheritdoc} */ public function addField(\Magento\Framework\Data\Collection $collection, $field, $alias = null) { $pluginInfo = $this->pluginList->getNext($this->subjectType, 'addField'); if (!$pluginInfo) { return parent::addField($collection, $field, $alias); } else { return $this->___callPlugins('addField', func_get_args(), $pluginInfo); } } }
      
      





Stectrace呼び出し





Magento 2で生成されたクラスはオレンジ色で強調表示され(26行目は___callPlugins



です)、白は独自のプラグインです。



おわりに



スタックトレースから、Magento 2のDIは、プラグインが「フック」で生成されるクラスを置き換えることが明らかです。これは、元のメソッドの「ラッパー」のaround



順次適用されます。



 return $this->___callPlugins('addField', func_get_args(), $pluginInfo);
      
      





そして時には元のメソッド自体:



 return parent::addField($collection, $field, $alias);
      
      





参照資料






All Articles