Magento 2 で「インターセプト可能/プラグイン可能」なクラスは何ですか
-
13-12-2019 - |
質問
日付:2015 年 5 月 30 日 (Magento 2 の変化する性質を考慮して)。
Magento2の導入 プラグインの概念, 、実装されました インターセプターパターン経由.
ドキュメントから明らかになっていないのは、Magento のどのクラスとオブジェクトが「インターセプト可能」なのかということです。つまり、次のような XML を使用してプラグインを構成します。
<config>
<type name="{ObservedType}">
<plugin name="{pluginName}" type="{PluginClassName}" sortOrder="1" disabled="true"/>
</type>
</config>
しかし、どのクラスが有効であるかは明らかではありません。 ObservedType
. 。これ 古いウィキ記事 というときにいくつかの手がかりを提供します
プラグインの機能は、依存関係注射なしで作成されたクラス、つまり、新しい直接的なオペレーターで作成されたクラス、-finalメソッド、finalクラスに適用されないことに注意してください。
は どれでも 依存関係注入によって作成されたオブジェクトはインターセプト可能ですか?しますか? ObservedType
a で提供されるタイプヒントである必要があります __construct
それとも何か別のものを使用できるのでしょうか (そうすべきでしょうか?)
主に、Magento 2 インターセプターを使い始める前に、Magento 2 インターセプターで何ができるのか、何ができないのかを理解しようとしています。
解決
マゼントモジュールのクラスはすべての梱包可能です。
現在のWikiに記載されているように、それは最終的な方法とクラスによって制限されています
検証されていませんが、ライブラリのクラス(libディレクトリ)は傍受されない(/は)。
制限されたオブジェクトの作成方法は、少なくともオートローダが正しく構成されている場合、私は考えています。そして、彼らがその場で作成されないのではなく、発電機が実行されたときには関係ありません。(そのため、マゼントオートローダは最初のものになるはずです)
他のヒント
我々は、「em>推奨メソッドを注釈に備えています。アップグレード可能性を心配している場合は、 can に追加すると、プラグインが定義されているものに追加する必要があります。には、プラグインが定義されていることを検討する必要があります。 API以外のメソッドの傍受はお勧めしませんが、時にはそれが最良の選択肢かもしれません。 (私達はそれを開発者の裁量に残します。)
正式には、最終的ではない公衆メソッドを傍受することができます。プライベートメソッドは間違いなく仕事をしません。メモリから、傍受は現在、実クラスを継承する子孫クラスを作成することによって機能します(Real Classの新しいインスタンスを求めるときに生成されたクラスのインスタンスを作成します)。そのため、サブクラスを作成できるようにし、元のメソッドがおそらく機能することを許可するものはおそらく機能しますが、パブリックメソッドは推奨され、将来の他の巧妙な実装を使用するための柔軟性を与えます(これは決して正当な理由なしに現実的ではないだろう) 。
これにはすでに答えがあることは知っていますが、2年前のことです。もしかしたら、その間に何かが変わったのかもしれません。
これまでに見つけたものは次のとおりです。
から 公式ドキュメント そして傍受プロセスの掘り下げから。
逆に答えます。
何 できません Magento 2 で傍受されます。
公式ドキュメントより
- Magento\Framework\Interception がブートストラップされる前にインスタンス化されたオブジェクト (そのポイントがどこにあるのかは不明)
- 最終的なメソッド
- 最終クラスの任意のメソッド (生成されたインターセプター クラスは元のクラスを拡張する必要があるため)
- 少なくとも 1 つの最終パブリック メソッドを含むクラス
- 非パブリック メソッド (保護されたメソッドでも機能する可能性がありますが、非パブリック メソッドをクラスの外部に公開することになるため、これは「倫理的」ではありません)
- 静的メソッド
- __構築
- 仮想タイプ
あちこち掘ってみると
- オブジェクト マネージャーを介してインスタンス化されないクラス内のメソッド。(例
\Magento\Framework\Phrase
) - 実装するクラス
\Magento\Framework\ObjectManager\NoninterceptableInterface
. 。(例えば\Magento\Framework\App\Cache\Proxy
および他のすべての自動生成プロキシ)