Les classes d'intercepteurs sont une implémentation du modèle de conception d'intercepteurs . Les intercepteurs expliquent comment le système d'objets de Magento 2 implémente un système de plugins .
En tant que développeur client, la théorie est que vous n'avez pas à vous soucier des intercepteurs - vous demandez au gestionnaire d'objet un objet de type X, et il vous le renvoie. L'objet que vous avez demandé peut ou non être un intercepteur, mais du point de vue du programmeur client, il se comporte de la même manière que la version non intercepteur. Comment le gestionnaire d'objets décide de renvoyer ou non un intercepteur dans un détail d'implémentation.
Pour les personnes intéressées par ce détail d'implémentation - si une classe, ou une classe parente de cette classe, a un plugin configuré, le gestionnaire d'objets renvoie un intercepteur. Vous pouvez voir que dans la classe d'intercepteur en mode développeur ici
#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;
}
Pour la production (c'est-à-dire le mode compilé), Magento pré-analyse le système pendant le mode de compilation et note les classes qui ont besoin de plugins.
Quant à la génération actuelle, Magento gère cela avec un chargeur automatique PHP. Si un développeur instancie une classe (ou déclenche autrement un événement de chargement automatique PHP avec un nom de classe (dans un indice de type, une class_exists
classe, etc.) et que le chargeur automatique basé sur le compositeur ne trouve pas le fichier de classe, un deuxième chargeur automatique enregistré
Magento\Framework\Code\Generator\Autoloader::load
est déclenché. Ce chargeur automatique
vendor/magento/framework/Code/Generator/Autoloader.php
va (indirectement via la Magento\Framework\Code\Generator
classe) rechercher la classe pour certains modèles de nommage. Si le nom de classe se termine par Interceptor
, Magento finit par générer un intercepteur via la generateClass
méthode de cette classe
vendor/magento/framework/Code/Generator.php
Il y a des classes / objets supplémentaires à tracer à partir du Magento\Framework\Code\Generator
- mais nous laisserons cela comme un exercice pour le lecteur.