Magento2:プラグインと設定の基本的な違いは何ですか?


47

magento2チュートリアルでプラグインと設定の両方を使用しましたが、どちらも正常に機能していますが、基本的な違いは何ですか。

プラグインのコード:

1.1)di.xmlにプラグイン宣言を追加します。

<type name="Magento\Catalog\Model\Product">
<plugin name="magento-catalog-product-plugin" type="Training\Test\Model\Product" sortOrder="10"/>
</type>

1.2)プラグインクラスを作成します。

<?php
namespace Training\Test\Model;
class Product {
public function afterGetPrice(\Magento\Catalog\Model\Product $product, $result) {
return 5;
}
}

好みのコード:

2.1)プリファレンス宣言を作成します。

<preference for="Magento\Catalog\Model\Product"
type="Training\Test\Model\Testproduct" />

2.2)新しい製品クラスを作成します。

<?php
namespace Training\Test\Model;
class Testproduct extends \Magento\Catalog\Model\Product
{
public function getPrice() {
return 3;
}
}

回答:


59

プリファレンスは、Magento 1からのクラスの書き換えと同等です。「コードが要求するたびにClassAMyClassB代わりに提供してください」と言うのと同等です。MyClassBは、の完全な実装にClassA加えて、上で追加または変更する動作を期待しています。

Magento 1の場合と同様に、手動で連鎖する(MyClassBextends OtherClassBOtherClassBextendsなどClassA)場合を除き、一度にアクティブにできる設定(書き換え)は1つだけです。

プラグインを使用すると、フックしているクラスのメソッドの前後または前後にコードを実行できます。プラグインクラスはターゲットクラスを置き換えず、そのインスタンスではありません。ちょうど方法有しbefore{method}around{method}after{method}ターゲットクラスのメソッド{}に対してで適切な時期に実行得ます。

プラグインはターゲットクラスを置換しないため、任意の数のプラグインをクラスで同時にアクティブにできます。Magentoは、XMLのsortOrderパラメーターに基づいて次々にそれらを実行するだけです。

そのため、プラグインは設定よりもはるかに柔軟です。可能な限りプラグインを使用し、絶対に必要な場合を除き、クラスを書き換える設定は避けてください。

プラグインがどのように機能し、それらをどのように使用するかについての詳細は、公式ドキュメントで読むことができます


好みはクラスの書き換えと同等ではありません。インターフェイスのデフォルト実装を提供する方法です。
カンディ

1
@KAndyこれは基本的な意図された目的かもしれませんが、その副作用はクラスのオーバーライドにも有効です。意味的には同じです。好みを介したクラスの書き換えは、Yogeshが求めていたものであり、彼が取り組んでいたFundamentalsのエクササイズもあなたに指示しています。
ライアンホー

12

簡単な言葉で

プリファレンスはクラスのオーバーライドに使用されます

プラグインは、メソッドの前後、前後に機能を追加するために使用されます。

As Yourの例:

<preference for="Magento\Catalog\Block\Product\ListProduct" type="Vendor\MyModule\Block\Product\ListProduct" /> 

コードがListProductを要求するときはいつでも、好みはそれを言いました

ねえ、 Vendor\MyModule\Block\Product\ListProduct 代わりに Magento\Catalog\Block\Product\ListProduct

<type name="Magento\Catalog\Model\Product">
<plugin name="magento-catalog-product-plugin" type="Training\Test\Model\Product" sortOrder="10"/>
</type>

コードがgetPrice()を要求するたびに、プラグインは

ちょっと getPrice() あなたの 方法の前、後、周りに私の方法を使用してくださいgetPrice()


1

簡単に言うと:

優先順位は、インターフェイスのデフォルトの実装を指定するために使用されます。

プラグイン(Interceptor)は、別のクラスのパブリックメソッドの動作を拡張するために使用されます。

詳細に :

設定: インターフェイスを実装するクラスが複数ある場合は、実装されているすべてのクラスのデフォルトのクラスを指定することが重要です。これは、依存性注入ファイル(di.xml)の設定ノードを介して行われます。

例:

<preference for="Magento\Catalog\Block\Product\ListProduct" type="Vendor\MyModule\Block\Product\ListProduct" /> 

このマッピングはにapp/etc/di.xmlあるため、オブジェクトマネージャーは、グローバルスコープ内にがMagento\Core\Model\Url要求されるたびに実装クラスを注入しMagento\Core\Model\UrlInterfaceます。

プラグイン(インターセプター):

たとえば、クラスにAmethodA拡張機能を必要とするメソッドがあります。次に、APlugin元のクラスを変更せずにクラスを作成することにより、プラグインを介してこれを実現しAます。クラスにAPluginは、必要なメソッドの前、後、または周囲で実行されるメソッドがあります。

例:

<config>
    <type name="Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStock">
        <plugin name="showOutOfStockValueChanged" type="Magento\Catalog\Model\Plugin\ShowOutOfStockConfig"/>
    </type>
</config>

このマッピングはapp / etc / di.xmlにあります。1つ/いくつかのクラスMagento\CatalogInventory\Model\Config\Backend\ShowOutOfStockメソッドは、クラスメソッドの前/後/周辺で実行されMagento\Catalog\Model\Plugin\ShowOutOfStockConfigます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.