Um dos principais diferenciais do Magento 2 são os plugins, ao contrário do Magento 1 que só tinhamos a opção de sobrescrever uma classe para sobrescrever um método e extender a original, no Magento 2 podemos fazer nossos módulos modificarem um método antes, depois ou durante a execução.

É importante saber que no contrato da versão Enterprise o Magento Commerce, você assina um contrato legal em que vai seguir tudo que fala no Devdocs, caso contrário pode perder o SLA (Service Level Agreement), que significa “Acordo de Nível de Serviço — ANS em português”.

Isso acima é apenas um resgarde legal que eles fazem para quando não quiserem dar suporte por má praticas aplicadas ou módulos de terceiros sem aplicar os padrões do Magento, não tem relação totalmente direta com o que abordo nessa postagem.

Mitos

Cuidado com os paradigmas que vão te tornar improdutivo, os padrões em projetos são feitos para facilitar a sua vida e não para dificultar, falo isso por que se você for seguir a risca o DevDocs nem sempre você vai entregar a melhor solução (custo/benefício), é como implementar GitFlow ou Scrum exatamente como manda o manual sem modificar nada, na maioria das vezes seria melhor ajustar a sua necessidade, isso não quer dizer que está errado.

Essa é a lista dos principais pontos que você deve tomar cuidado:

  • Achar que o DevDocs é a verdade absoluta sagrada, ele é um guia para te ajudar e não ao contrário, como por exemplo a Wikipédia.
  • Não considerar outra solução se não existir no DevDocs.
  • Não contribuir, você pode começar a contribuir com pequenas coisas como syntax ou ortografia, isso vai ajudar a ver o quanto a documentação é flexível e já ajuda a quebrar o paradigma.

O que diz o DevDocs?

Basicamente o que diz no DevDocs sobre a utilização de plugins é o seguinte:

"Um plugin, or interceptor, é uma classe que modifica o comportamento de funções de classes públicas interceptando a mesma através da execução do código antes, depois ou ao redor da função chamada. Isto permite você substituir ou extender o comportamento original de métodos públicos de qualquer classe or interface."

Então quais são as restrições? Aqui estão algumas situações em que o uso de plugins não se aplicam:

  • Objetos não são instanciados antes do Magento\Framework\Interception ser inicializado
  • Métodos finais
  • Classes finais
  • Qualquer classe que contenha pelo menos um método público final
  • Métodos não públicos
  • Métodos estáticos
  • __construct
  • Tipos Virtual (Virtual Types)

O que importa?

O que realmente importa na tomada de decisão é você conhecer o conceito dessa ferramenta e não decorar o DevDocs (o que não é algo ruim), leve em consideração o que o cliente quer, o cenário envolvido e também a arquitetura do projeto, esses sem dúvidas são os pontos mais relevantes. Abaixo estão alguns cenários para você refletir.

1º Ordenação absoluta

Sobreescrita pode ser útil quando você precisa que seu código seja executado antes de plugins. Mesmo podendo fazer isso via sortOrder, mas você não terá certeza que seu código sempre vai executar antes quando alguém (não você) instalar um módulo de terceiro.

2º Excluir código

Se você precisa excluir ou sobrescrever apenas uma parte do código em um método, um plugin pode não ser a melhor opção. Mesmo podendo utilizar um plugin around e evitar chamar o proceed, mas isto pode quebrar outros plugins na mesma stack de execução.

3º Estilo de código

Você deve usar a sobreescrita quando você precisa sobrescrever um comportamento, plugins devem ser utilizados para modificar o output ou executar o código antes ou depois.

Um plugin, sempre deve executar o código original para evitar quebrar outros módulos.

Um plugin é uma boa opção se você considerar um método do core como uma caixa preta com um input e um output quando não se tem certeza de como é o mecanismo do método. Ou também caso precise alterar um comportamento interno desse método.

O que achou?

É sempre bom discutir conceitos não é? Já precisou utilizar sobreescrita ao invés de plugins também? Deixe nos comentários abaixo sua opinião, obrigado! 👨‍💻😉

Referências:

Rewriting Magento 2 classes vs Plugins

DevDocs guia de extensões e plugins