Magento 2: Plugin vs Observador

27

No Magento 2, quais são os prós e os contras de usar um plug-in versus um observador para conseguir algo?

Entendo que os observadores estão inscritos nos eventos, enquanto os plugins podem entrar antes e / ou depois de um método público ser chamado em uma classe Magento, mas certamente eles estão chegando muito perto de cruzar caminhos agora?

Robbie Averill
fonte
observador muito limitado, mas plugin que você fazer as mudanças para toda a função pública
Pradeep Kumar

Respostas:

42

Os plugins são onipresentes, pois é possível modificar / substituir o comportamento de qualquer método público no sistema. As personalizações devem ser feitas usando plug-ins para métodos / classes públicos marcados com @apianotação (API pública estável) sempre que possível. Essa abordagem garante que a personalização permaneça funcional após os novos lançamentos do Magento. Além dos before/ afterplugins mencionados na pergunta, é possível criar aroundplugins para substituir o comportamento original.

Por outro lado, os observadores são um mecanismo de extensão herdado herdado do Magento 1, é bastante limitado e deve ser evitado, se possível. No entanto, diferentemente dos plug-ins, eles podem fornecer pontos de extensão dentro de métodos protegidos / privados.

Alex Paliarush
fonte
Dê uma olhada na resposta falando sobre preferências versus plugins / observadores: magento.stackexchange.com/a/94035/697 , pode ser útil.
Alex Paliarush
@alex: - como escrever um plugin para a função protegida, na maioria das vezes precisamos substituir a função protegida nessa situação, como fazê-lo? magento.stackexchange.com/questions/91353/...
Pradeep Kumar
Os plug-ins do @PradeepKumar podem ser adicionados apenas a métodos públicos. A pergunta que você mencionou tem uma resposta, mas a solução proposta está bloqueada, mas é um problema conhecido (os plug-ins não podem ser aplicados aos tipos virtuais). Como solução temporária você pode declarar plug-in para a classe quadro URL e não adicionar lógica condicional com base em argumentos (de modo que plugin faz algo sobre o seu caso apenas)
Alex Paliarush
i jut deu um exemplo, há muita função em protegidas nesse caso como substituir, de qualquer forma eu não para substituir função protegida
Pradeep Kumar
@PradeepKumar se você precisar substituir um método protegido, pode ser necessário estender a classe e usar preferência / reescrita. Enfim, sugira que você faça uma pergunta para ela em vez desses comentários
Robbie Averill
1

De acordo com o guia técnico do Magento ( https://devdocs.magento.com/guides/v2.1/coding-standards/technical-guidelines.html#14-events ): Todos os valores (incluindo objetos) passados ​​para um evento NÃO DEVEM SER modificado no observador de eventos. Em vez disso, os plugins DEVEM SER usados ​​para modificar a entrada ou saída de uma função.

Para mim, a principal diferença entre plugins e observadores é:

  1. Os plug-ins podem modificar apenas métodos públicos, enquanto os observadores podem modificar privados e protegidos.
  2. Há uma ordem de classificação para plug-ins, mas não há uma ordem de classificação para observadores.
  3. Você pode adicionar observador apenas aos eventos que já foram despachados no Magento. Os plugins são mais flexíveis aqui.
transverso
fonte
Também posso atualizar um pedido com um observador, certo?
Robbie Averill
@RobbieAverill sim, você pode criar um observador para checkout_submit_all_after evento. Seu observador será acionado após o pedido ser feito com sucesso.
transversus
Isso significa que "eles não modificam dados" não é verdade nesse caso?
Robbie Averill
11
Sim, você está correto @RobbieAverill Tanto os plugins quanto os observadores podem modificar os dados. Para mim, a principal diferença entre plug-ins e observadores é: 1. Os plug-ins podem modificar apenas métodos públicos, enquanto os observadores também podem modificar privados e protegidos. 2. Há uma ordem de classificação para plug-ins, mas não há uma ordem de classificação para observadores. 3. Você pode adicionar observador apenas aos eventos que já foram despachados no Magento. Os plugins são mais flexíveis aqui.
transversus