Magento 2: ¿cuáles son los archivos Interceptores en var / generation?

24

Entonces noté algunos Interceptor.phparchivos envar/generation

Sé que esta carpeta contiene clases generadas creadas sobre la marcha para lo siguiente:

  • Suerte
  • Proxies
  • Complementos

Supongo que los archivos Interceptor están vinculados a los complementos, sin embargo, a veces no entiendo cómo se generan esos archivos. Por ejemplo, tengo var/generation/Magento/Framework/App/Response/Http/Interceptor.phppero este archivo no parece coincidir con ninguna clase existente.

Entonces, ¿estoy buscando un flujo de trabajo bien explicado sobre cómo se generan los archivos Interceptor.php?

Raphael en Digital Pianism
fuente

Respuestas:

32

Las clases de interceptor son una implementación del patrón de diseño de interceptor . Los interceptores son cómo el sistema de objetos de Magento 2 implementa un sistema de complementos .

Como desarrollador de clientes, la teoría es que no necesita preocuparse por los interceptores: le pide al administrador de objetos un objeto de tipo X y se lo devuelve. El objeto que solicitó puede o no ser un interceptor, pero desde el punto de vista del programador del cliente, se comporta igual que la versión sin interceptor. Cómo el administrador de objetos decide devolver o no un interceptor en un detalle de implementación.

Para las personas interesadas en ese detalle de implementación: si una clase, o una clase principal de esa clase, tiene un complemento configurado, el administrador de objetos devuelve un interceptor. Puedes ver eso en la clase de interceptor en modo desarrollador aquí

#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;
}

Para la producción (es decir, el modo compilado), Magento escanea previamente el sistema durante el modo de compilación y toma nota de qué clases necesitan complementos.

En cuanto a la generación real, Magento maneja esto con un cargador automático PHP. Si un desarrollador crea una instancia de una clase (o activa un evento de carga automática de PHP con un nombre de clase (en una pista de tipo, class_existsclase, etc.), y el cargador automático basado en el compositor no puede encontrar el archivo de clase, un segundo cargador automático registrado

Magento\Framework\Code\Generator\Autoloader::load

se activa Este autocargador

vendor/magento/framework/Code/Generator/Autoloader.php

buscará (indirectamente a través de la Magento\Framework\Code\Generatorclase) la clase en busca de ciertos patrones de nomenclatura. Si el nombre de la clase termina en Interceptor, Magento termina generando un interceptor a través del generateClassmétodo en esta clase

vendor/magento/framework/Code/Generator.php

Hay clases / objetos adicionales para rastrear desde Magento\Framework\Code\Generator, pero lo dejaremos como un ejercicio para el lector.

Alan Storm
fuente