インターセプタークラスは、インターセプターデザインパターンの実装です。インターセプターは、Magento 2のオブジェクトシステムがプラグインシステムを実装する方法です。
クライアント開発者としての理論は、インターセプターを心配する必要はないということです。オブジェクトマネージャーにX型のオブジェクトを要求すると、それが返されます。要求したオブジェクトはインターセプターである場合とそうでない場合がありますが、クライアントプログラマーの観点からは、インターセプターではないバージョンと同じように動作します。オブジェクトマネージャーが実装の詳細でインターセプターを返すかどうかを決定する方法。
その実装の詳細に興味がある人-クラス、またはそのクラスの親クラスにプラグインが構成されている場合、オブジェクトマネージャーはインターセプターを返します。開発者モードのインターセプタークラスで確認できます
#File: vendor/magento/framework/Interception/ObjectManager/Config/Developer.php
public function getInstanceType($instanceName)
{
$type = parent::getInstanceType($instanceName);
if ($this->interceptionConfig && $this->interceptionConfig->hasPlugins($instanceName)
&& $this->interceptableValidator->validate($instanceName)
) {
return $type . '\\Interceptor';
}
return $type;
}
本番(コンパイル済みモード)の場合、Magentoはコンパイルモード中にシステムを事前スキャンし、プラグインが必要なクラスをメモします。
実際の生成に関しては、MagentoはこれをPHPオートローダーで処理します。開発者がクラスをインスタンス化する(または、(タイプヒント、class_exists
クラスなどの)クラス名でPHP自動ロードイベントをトリガーする)場合、コンポーザーベースのオートローダーがクラスファイルを見つけられない場合、2番目に登録されたオートローダー
Magento\Framework\Code\Generator\Autoloader::load
トリガーされます。このオートローダー
vendor/magento/framework/Code/Generator/Autoloader.php
(Magento\Framework\Code\Generator
クラスを介して間接的に)特定の命名パターンのクラスをスキャンします。クラス名がで終わる場合Interceptor
、Magento generateClass
はこのクラスのメソッドを介してインターセプターを生成します
vendor/magento/framework/Code/Generator.php
から追跡する追加のクラス/オブジェクトがありMagento\Framework\Code\Generator
ますが、読者のための演習として残しておきます。