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.

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top