Magento 2: quais são os arquivos do Interceptors em var / generation?

24

Então notei alguns Interceptor.phparquivos novar/generation

Eu sei que esta pasta contém classes geradas criadas dinamicamente para o seguinte:

  • Fábricas
  • Proxies
  • Plugins

Suponho que os arquivos do Interceptor estejam vinculados aos do plugin, mas às vezes não entendo como esses arquivos são gerados. Por exemplo, eu tenho, var/generation/Magento/Framework/App/Response/Http/Interceptor.phpmas esse arquivo não parece corresponder a nenhuma classe existente.

Então, eu estou procurando um fluxo de trabalho bem explicado sobre como os arquivos Interceptor.php são gerados?

Raphael na Digital Pianism
fonte

Respostas:

32

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_existsclasse 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\Generatorclasse) procurará na classe certos padrões de nomenclatura. Se o nome da classe termina Interceptor, o Magento acaba gerando um Interceptor através do generateClassmé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.

Alan Storm
fonte