Interceptor-Klassen sind eine Implementierung des Interceptor-Entwurfsmusters . Die Interceptors beschreiben, wie das Objektsystem von Magento 2 ein Pluginsystem implementiert .
Als Client-Entwickler müssen Sie sich theoretisch keine Gedanken über Interceptors machen. Sie fragen den Objektmanager nach einem Objekt vom Typ X und er gibt es an Sie zurück. Das Objekt, nach dem Sie gefragt haben, kann ein Interceptor sein oder nicht, aus Sicht des Client-Programmierers verhält es sich jedoch genauso wie die Nicht-Interceptor-Version. Wie der Objektmanager entscheidet, einen Interceptor in einem Implementierungsdetail zurückzugeben oder nicht zurückzugeben.
Für Personen, die an diesem Implementierungsdetail interessiert sind - wenn für eine Klasse oder eine übergeordnete Klasse dieser Klasse ein Plugin konfiguriert ist, gibt der Objektmanager einen Interceptor zurück. Sie können dies in der Entwicklermodus-Interceptor-Klasse hier sehen
#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;
}
Für die Produktion (dh im kompilierten Modus) scannt Magento das System im Kompilierungsmodus vor und merkt sich, welche Klassen Plugins benötigen.
Für die eigentliche Generation erledigt Magento dies mit einem PHP-Autoloader. Wenn ein Entwickler eine Klasse instanziiert (oder auf andere Weise ein PHP-Autoload-Ereignis mit einem Klassennamen auslöst (in einem Typhinweis, einer class_exists
Klasse usw.) und der composer-basierte Autoloader die Klassendatei nicht findet, wird ein zweiter Autoloader registriert
Magento\Framework\Code\Generator\Autoloader::load
ausgelöst wird. Dieser Autoloader
vendor/magento/framework/Code/Generator/Autoloader.php
wird (indirekt über die Magento\Framework\Code\Generator
Klasse) nach bestimmten Namensmustern für die Klasse suchen. Wenn der Klassenname auf endet Interceptor
, generiert Magento über die generateClass
Methode in dieser Klasse einen Interceptor
vendor/magento/framework/Code/Generator.php
Es gibt noch weitere Klassen / Objekte, die Sie ausfindig machen können Magento\Framework\Code\Generator
- aber das belassen wir als Übung für den Leser.