Magento 2クラスとプラグインの書き換え


17

Magento 2には、Magento 1とは反対のプラグイン/インターセプト/インターセプターの概念があります。
これらは、すべてのパブリックメソッドのイベントの前後のように機能します。いいね メソッドの機能を置き換えるためにプラグインを
使用することもできaroundます。
ただし、Magento 2では、M1方式とほぼ同様にクラスを書き換えることができます。
プラグインを使用する代わりにクラスを書き換えることが方法であるいくつかの例を見てみたいと思います。
これは、コア保護されたメソッドの動作を変更したいときに便利ですが、書き換えが推奨または必要な場合は他にありますか?


回答:


19

プラグインの代わりに書き換えを使用する明白な理由は、private、protected、またはfinalメソッドをオーバーライドする必要がある場合です。

ただし、次のシナリオも考慮してください。

最初のシナリオ(絶対ソート順):

書き換えは、プラグインの前にコードを実行する必要がある場合に役立ちます。プラグインを設定することでそれができることはわかっていますがsortOrder、サードパーティのコンポーネントをインストールするとき(あなたではない)があなたのコードが常に最初であることを確認することはできません。

2番目のシナリオ(コードを除く):

メソッド内のコードの一部のみを除外または書き換える必要がある場合、プラグインは次善の方法である可能性があります。aroundプラグインを使用して、の呼び出しを回避できることはわかっていますがproceed、これによりスタック内の他のプラグインが破損する可能性があります。

3番目のシナリオ(コードスタイル):

振る舞いを書き換える必要がある場合は、書き換えを使用する必要があります。プラグインを使用して、出力変更たり、前後にコードを実行したりする必要があります。

プラグインは、他のモジュールを壊さないように常に元のコード実行する必要があります。

私の結論:

コアメソッドを入力と1つの出力を持つブラックボックスと見なすことができ、その内部メカニズムにとらわれない場合、プラグインが最適なオプションになる可能性があります。

内部の動作変更する必要がある場合は、書き換えが最適なオプションである可能性があります。


beforeまたはarroundプラグインは実際のメソッドコードの前に実行される(または実行できる)ため、最初のシナリオはわずかに不正確です(単なる言い回しだと思います)。
デビッドVerholen 16

はい、私の言い回しは正しくありませんでした。私のポイントは、実際のメソッドでの相対的なソート順についてでした。
Phoenix128_RiccardoT

7

すばらしい質問です。先日同じことを自問しましたが、ここで思いついたことがあります。

  • まず、プラグインはファイナルメソッド、ファイナルクラス、および依存性注入なしで作成されたクラスには使用できません。
  • 第二に、プラグインの定義に留意する必要があります。メソッドレベルでの作業に使用されますが、クラスレベル全体での作業には設定が使用されます。誰にとっても明らかではないので、それを念頭に置いておくとよいでしょう。
  • 最後に、それが最も重要だと思います。プラグインはMagentoクラス内のパブリックメソッドの動作を拡張するためにのみ使用できるようです。したがって、プロテクト/プライベートメソッドでプラグインを使用できないようです。

出典:Magento U基礎コース


2
OK。正当な理由。しかし、2番目の点について何を言うべきかわかりません。同じクラスから多くのパブリックメソッドをプラグインする場合、最も安全な方法は、それらすべてのプラグインとして機能する単一のクラスを作成することだと思います。(私の意見)。誰かが他の理由を思い付くかどうかを確認するために、2〜3日これを開いたままにします。そうでない場合...チェックマークはあなたのものです。
マリウス

@マリウスあなたは絶対に正しい再:第二のポイント。何らかの理由で、プラグインを作成したいすべてのメソッドに対していくつかのプラグインファイルを作成する必要があると考えましたが、それはプラグインではなくオブザーバーが行うことだと思います。理由がもっとあるかどうかを確認するためにもっと多くの人が返信すれば、それは素晴らしいことです(明らかではありません)。
デジタルピアニズムのラファエル

1
@mariusの追加:プラグインはドメイン固有である必要があるため、同じ機能の実装である場合、1つのクラスで複数のプラグインのみを定義することが少なくともベストプラクティスであると思います。書き換えでは、常にクラス全体を変更するため、このオプションはありません。私はそれが回避書き換えに少なくとも試しに一つの理由だと思うので
デヴィッドVerholen

@DavidVerholen。全くもって同じ意見です。しかし、プラグインの代わりに書き換えを使用する理由を尋ねていました。
マリウス

はい、私はこれが書き換えは一度だけ行うことができますしながら、あなたは、クラスのプラグイン機能の特定を定義することができますので、プラグインを使用する理由かもしれないと思う
デヴィッドVerholen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.