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_exists
clase, 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\Generator
clase) 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 generateClass
mé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.