Magento 2の「インターセプト可能/プラグイン可能」なクラス


17

日付:2015年5月30日(Magento 2の性質の変化を考慮)。

Magento 2は、インターセプターパターンを介して実装されたプラグインコンセプトを導入しまし

ドキュメントから明らかでないのは、Magentoのどのクラスとオブジェクトが「インターセプト可能」なのかということです。つまり、次のようなXMLを使用してプラグインを構成します

<config>
    <type name="{ObservedType}">
        <plugin name="{pluginName}" type="{PluginClassName}" sortOrder="1" disabled="true"/>
    </type>
</config>

ただし、として有効なクラスは明確ではありませんObservedType。この古いwikiの記事は、それが言うときにいくつかの手がかりを提供します

プラグイン機能は適用されないことに注意してください-依存性注入なしで作成されたクラス、つまり、演算子newを直接使用して作成されたクラス

ある任意の傍受することが可能な依存性注入を経て作成されたオブジェクトは?メソッドでObservedType提供されるタイプヒントである必要がありますか__construct、それとも他の何かである必要がありますか?

主に、Magento 2インターセプターを使用する前に、Magento 2インターセプターでできることとできないことを回避しようとしています。

回答:


10

Magentoモジュールのすべてのクラスは互換性があります。

現在のwikiで説明されているように、最終的なメソッドとクラスによって制限されています

検証されていませんが、ライブラリのクラス(libディレクトリ)を傍受することはできません(/ should)。

少なくともオートローダーが正しく構成されている場合、オブジェクトの作成方法の制限はもはや当てはまりません。そして、それらはその場で作成されるのではなく、ジェネレータが実行されたときに問題になりません。(だからそれだけの問題です、magentoオートローダーが最初のものでなければなりません)


2
libクラスのインターセプトに制限はありません。また、オブジェクトをインターセプト可能にするには、ObjectManager(コンストラクターインジェクション)で作成する必要があります。
アントンクリル

1
マジックメソッド(ただし、phpdocを使用して宣言されている)はインターセプトできないことに注意してください。おもう。Varien_Objectスタイルはまだいくつかの場所に存在しています。
-nevvermind

11

「@api」アノテーションに取り組んでおり、リリース間でより安定する推奨メソッドにアノテーションを付けています。プラグインを定義できるものに加えて、アップグレード可能性を心配する場合は、プラグインを定義すべきものも考慮する必要があります。@api以外のメソッドのインターセプトはお勧めしませんが、それが最善の選択肢であることがわかっている場合があります。(開発者の裁量に任せます。)

公式には、ファイナルではないパブリックメソッドをインターセプトできます。プライベートメソッドは間違いなく機能しません。現在、メモリからのインターセプトは、実際のクラスを継承する子孫クラスを作成することで機能します(実際のクラスの新しいインスタンスを要求すると、依存関係注入フレームワークは生成されたクラスのインスタンスを作成します)。したがって、サブクラスを作成し、元のメソッドをオーバーライドできるものはおそらく機能しますが、パブリックメソッドが推奨され、将来的に他の巧妙な実装を使用する柔軟性が得られます(正当な理由がなければ現実的ではありません) 。


5

これにはすでに答えがありますが、2年前のものです。その間に何か変わったのかもしれません。

ここに私がこれまで見つけたものがあります。公式文書
からや傍受プロセスに掘りから。

私は他の方法で答えます。
何がことはできません Magentoの2に傍受され
、公式ドキュメントから

  • Magento \ Framework \ Interceptionがブートストラップされる前にインスタンス化されるオブジェクト(そのポイントがどこにあるかわからない)
  • 最終的な方法
  • finalクラスのメソッド(生成されたインターセプタークラスは元のクラスを拡張する必要があるため)
  • 少なくとも1つの最終パブリックメソッドを含むクラス
  • 非公開メソッド(保護されたメソッドに対しては機能しますが、非公開メソッドをクラスの外部に公開するため、これは「倫理的」ではありません)
  • 静的メソッド
  • __construct
  • 仮想タイプ

掘ってから

  • オブジェクトマネージャを介してインスタンス化されないクラスのメソッド。(例\Magento\Framework\Phrase
  • 実装するクラス\Magento\Framework\ObjectManager\NoninterceptableInterface。(たとえば\Magento\Framework\App\Cache\Proxy、他のすべての自動生成プロキシ)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.