Magento 2:プラグインとオブザーバー


27

Magento 2では、何かを達成するためにプラグインとオブザーバーを使用することの長所と短所は何ですか?

オブザーバーはイベントにサブスクライブするのに対し、プラグインはMagentoクラスでパブリックメソッドが呼び出される前および/または後にジャンプできることを理解していますが、確かにそれらはパスを交差するところに近づいていますか?


観察者は非常に限定されるものではなくなりますが、すべての公共の機能の変更を行うプラグイン
プラディープ・クマールを

回答:


42

システム内のパブリックメソッドの動作を変更/置換できるため、プラグインは偏在しています。可能な場合は、@apiアノテーション(安定したパブリックAPI)でマークされたパブリックメソッド/クラスのプラグインを使用してカスタマイズする必要があります。このようなアプローチにより、新しいMagentoのリリース後もカスタマイズが機能し続けることが保証されます。質問で言及されたbefore/ afterプラグインに加えて、around元の動作を置き換えるプラグインを作成することができます。

一方、オブザーバーはMagento 1から継承されたレガシー拡張メカニズムであり、かなり制限されているため、可能であれば回避する必要があります。ただし、プラグインとは異なり、保護/プライベートメソッド内に拡張ポイントを提供する場合があります。


また、プリファレンスとプラグイン/オブザーバーについての答えを見てください:magento.stackexchange.com/a/94035/697は役に立つかもしれません。
アレックスPaliarush

@alex:-保護された関数のプラグインを書く方法、ほとんどの場合、その状況で保護された関数をオーバーライドする必要がありますか?magento.stackexchange.com/questions/91353/...
プラディープ・クマール

@PradeepKumarプラグインは、パブリックメソッドにのみ追加できます。あなたが言及した質問には答えがありますが、提案されたソリューションはブロックされていますが、既知の問題(プラグインは仮想タイプに適用できません)。一時的な回避策として、フレームワークURLクラスのプラグインを宣言し、引数に基づいて条件付きロジックを追加します(プラグインがあなたのケースでのみ何かをするように)
Alex Paliarush

私突起部の一例を与え、機能の多くは、私が保護機能が上書きする方法をオーバーライドする方法、その場合には、保護にあり
プラディープ・クマール

@PradeepKumar保護されたメソッドをオーバーライドする必要がある場合は、クラスを拡張し、設定/書き換えを使用する必要があります。とにかく、これらのコメントではなく質問をすることをお勧めします
ロビーアヴェリル

1

Magentoテクニカルガイド(https://devdocs.magento.com/guides/v2.1/coding-standards/technical-guidelines.html#14-events)によると:イベントに渡されるすべての値(オブジェクトを含む)がイベントオブザーバで変更されました。代わりに、関数の入力または出力を変更するためにプラグインを使用する必要があります。

私にとって、プラグインとオブザーバーの主な違いは次のとおりです。

  1. プラグインはパブリックメソッドのみを変更できますが、オブザーバーはプライベート、プロテクトも変更できます。
  2. プラグインにはソート順がありますが、オブザーバーにはソート順はありません。
  3. オブザーバーは、Magentoで既にディスパッチされているイベントにのみ追加できます。ここでプラグインはより柔軟です。

オブザーバーで注文を更新することもできますか?
ロビーアヴェリル

@RobbieAverillはい、checkout_submit_all_afterイベントのオブザーバーを作成できます。注文が正常に行われた後、オブザーバーがトリガーされます。
transversus

その場合、「データを変更しない」というのは真実ではないということですか?
ロビーアベリル

1
はい、正しいです@RobbieAverillプラグインとオブザーバーの両方がデータを変更できます。私にとってプラグインとオブザーバーの主な違いは次のとおりです。2.プラグインにはソート順がありますが、オブザーバーにはソート順がありません。3.オブザーバーは、Magentoですでにディスパッチされているイベントにのみ追加できます。ここでプラグインはより柔軟です。
transversus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.