Quais classes são “capazes de interceptar/plugar” no Magento 2
-
13-12-2019 - |
Pergunta
Data:30 de maio de 2015 (dada a natureza mutável do Magento 2).
Magento 2 introduzido um conceito de plugin, implementado através de um padrão interceptador.
O que não está claro nos documentos é: quais classes e objetos no Magento são "capazes de interceptar"?Ou seja, você configura um plugin com XML parecido com o seguinte
<config>
<type name="{ObservedType}">
<plugin name="{pluginName}" type="{PluginClassName}" sortOrder="1" disabled="true"/>
</type>
</config>
mas não está claro quais classes são válidas como ObservedType
.Esse artigo wiki mais antigo fornece algumas pistas quando diz
Observe que o recurso do plug -in não se aplica a -classes criadas sem injeção de dependência, ou seja, criadas com o operador novo diretamente, -Final Methods, -Final Classes
É qualquer objeto criado via injeção de dependência disponível para ser interceptado?Será que o ObservedType
precisa ser a dica de tipo fornecida no a __construct
método, ou pode (deveria?) ser outra coisa?
Principalmente tentando entender o que pode e o que não pode ser feito com um interceptor Magento 2 antes de começar a usá-los.
Solução
Cada classe de um módulo Magento é intercaptável.
Conforme descrito no wiki atual, é limitado por métodos e classes finais
Não validado, mas classes de bibliotecas (diretório lib) não podem (/deveriam) ser interceptadas.
A limitação de como o objeto foi criado não é mais verdadeira, eu acho, pelo menos se o autoloader estiver configurado corretamente.E não deve importar, pois eles não são criados instantaneamente, mas quando o gerador é executado.(então é apenas uma questão de que o autoloader magento deve ser o primeiro)
Outras dicas
Estamos trabalhando em anotações "@api" para anotar recomendado métodos que serão mais estáveis entre os lançamentos.Se você se preocupa com a capacidade de atualização, além do que pode tiver um plugin definido, você também deve considerar o que deve tenha um plugin definido.Não recomendamos a interceptação de métodos que não sejam @api, mas às vezes sabemos que essa pode ser a melhor opção.(Deixamos isso a critério do desenvolvedor.)
Oficialmente, você pode interceptar métodos públicos que não sejam definitivos.Métodos privados definitivamente não funcionarão.Da memória, a interceptação atualmente funciona criando uma classe descendente que herda a classe real (a estrutura de injeção de dependência cria instâncias da classe gerada quando você solicita uma nova instância da classe real).Portanto, qualquer coisa que permita a criação de uma subclasse e a substituição do método original provavelmente funcionará, mas métodos públicos são recomendados, dando-nos flexibilidade para usar alguma outra implementação inteligente no futuro (o que nunca aconteceria sendo realista sem um bom motivo) .
Eu sei que isso já tem uma resposta, mas é de 2 anos atrás.Talvez algumas coisas tenham mudado nesse meio tempo.
Aqui está o que encontrei até agora.
De documentação oficial e de se aprofundar no processo de interceptação.
Eu responderei ao contrário.
O que NÃO PODE ser interceptado no Magento 2.
Do documento oficial
- Objetos que são instanciados antes de Magento\Framework\Interception ser inicializado (não tenho certeza de onde está esse ponto)
- Métodos finais
- Qualquer método das classes finais (porque a classe interceptora gerada precisa estender a classe original)
- Qualquer classe que contenha pelo menos um método público final
- Métodos não públicos (poderia funcionar para métodos protegidos, mas isso não é "ético", pois exporia métodos não públicos ao exterior da classe)
- métodos estáticos
- __construir
- Tipos virtuais
De cavar por aí
- métodos em classes que não são instanciadas por meio do gerenciador de objetos.(Exemplo
\Magento\Framework\Phrase
) - implementação de classes
\Magento\Framework\ObjectManager\NoninterceptableInterface
.(Por exemplo\Magento\Framework\App\Cache\Proxy
e todos os outros proxies gerados automaticamente)