As classes interceptoras são uma implementação do padrão de design do interceptador . Os interceptadores são como o sistema de objetos do Magento 2 implementa um sistema de plugins .
Como desenvolvedor de cliente, a teoria é que você não precisa se preocupar com interceptores - você pede ao gerenciador de objetos um objeto do tipo X e o devolve. O objeto que você solicitou pode ou não ser um interceptador, mas, do ponto de vista do programador cliente, ele se comporta da mesma forma que a versão não interceptadora. Como o gerenciador de objetos decide retornar ou não retornar um interceptador em um detalhe de implementação.
Para pessoas interessadas nesses detalhes de implementação - se uma classe, ou uma classe pai dessa classe, tiver um plug-in configurado, o gerenciador de objetos retornará um interceptador. Você pode ver isso na classe interceptora do modo de desenvolvedor aqui
#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 produção (ou seja, modo compilado), o Magento faz uma pré-varredura do sistema durante o modo de compilação e anota quais classes precisam de plugins.
Quanto à geração atual, o Magento lida com isso com um carregador automático PHP. Se um desenvolvedor instancia uma classe (ou dispara um evento de carregamento automático do PHP com um nome de classe (em uma dica de tipo, class_exists
classe etc.), e o carregador automático baseado no compositor não consegue encontrar o arquivo de classe, um segundo carregador automático registrado
Magento\Framework\Code\Generator\Autoloader::load
é acionado. Este carregador automático
vendor/magento/framework/Code/Generator/Autoloader.php
(indiretamente por meio da Magento\Framework\Code\Generator
classe) procurará na classe certos padrões de nomenclatura. Se o nome da classe termina Interceptor
, o Magento acaba gerando um Interceptor através do generateClass
método nesta classe
vendor/magento/framework/Code/Generator.php
Existem classes / objetos adicionais a serem rastreados Magento\Framework\Code\Generator
- mas vamos deixar isso como um exercício para o leitor.