Magento 2: qu'est-ce que le fichier Interceptors dans var / generation?

24

J'ai donc remarqué quelques Interceptor.phpfichiers dansvar/generation

Je sais que ce dossier contient des classes générées créées à la volée pour les éléments suivants:

  • Des usines
  • Procurations
  • Plugins

Je suppose que les fichiers Interceptor sont liés aux plugins, mais parfois je ne sais pas comment ces fichiers sont générés. Par exemple, j'ai, var/generation/Magento/Framework/App/Response/Http/Interceptor.phpmais ce fichier ne semble correspondre à aucune classe existante.

Donc , je suis à la recherche d'un bien expliqué flux de travail sur la façon dont sont générés les fichiers Interceptor.php?

Raphael chez Digital Pianism
la source

Réponses:

32

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_existsclasse, 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\Generatorclasse) 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 generateClassmé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.

Alan Storm
la source