Plugins são utilizados para extender, mudar o comportamento de qualquer método nativo de Magento em uma clasee.
Plugins alteram o comportamento da classe original mas não altera a classe propriamente.
Você não poder utilizar plugins para métodos finais, classes finais, métodos privado, ou classes criadas sem injeção de dependência.
Para garantir que o plugin funcione corretamente, você deve seguir regras de declaração e de nomes.
Plugins permitem modificar um métodos, enquanto a preferência permite alterar toda a classe.
No Magento 2, customizações podem ser realizadas através de:
* Preferências: Permite re-ecrever uma classe e trabalhar no novo nível da classe
* Injeção de Dependência
* Plugins: Permite customizar um método. Este método é basicamente re-escritas e eventos no nível da classe.
Plugins não conflitam entre eles pois são executados um após o outro.
Intercepção é uma abordagem utilizada para reduzir conflitos entre extensões que alteram o comportamento da mesma classe ou método.
Um interceptor é basicamente uma nova classe gerada, que irá chamar todo plugin, assim como o método original.
Você deve especificar os seguintes elementos quando estiver declarando um plugin:
* Type Name: Uma classe, interface, ou tipo virtual que o plugin observa.
* Plugin Name: Nome arbitrário que identifica o plugin.
* Plugin Type: O nome da classe do plugin ou o tipo virtual, utiliza a convencão <ModelName>\Plugin.
Os seguintes argumentos são opcionais e apenas devem ser especificados se necessário.
É uma boa prática omitir esses argumentos por padrão.
* Plugin sort order: A ordem em que o plugi que chama o mesmo métodos são executados
* Plugin disabled: Configure como verdadeiro para desabilitar o plugin.
Se você precisa alterar os argumentos de um método original, ou adicionar algum comportamento antes do método ser chamado. você deve utilizar o método: before-listener.
Se você precisa alterar os valores retornados pelo método original, ou adicionar algum comportamento após o método original ser chamado, você deve utilizar o método: after-listener.
Se você precisa alterar ambos o argumento e os valores retornados de um método original, ou adicionar algum comportamento antes ou após o método ser chamado, você deve utilizar o método around-listener.
Se você precisa alterar os valores retornados pelo método original, ou adicionar algum comportamento após o método original ser chamado, você deve utilizar o método: after-listener.
Se você precisa alterar ambos o argumento e os valores retornados de um método original, ou adicionar algum comportamento antes ou após o método ser chamado, você deve utilizar o método around-listener.
Diversas condições influenciam como aplicar plugins para a mesma classe/interface
Seja se o método listener em um plugin deve ser aplicado, antes, após ou “around” o método original.
O “Sort order” do plugin”: Parâmetro que defini a ordem em que um plugin que usa o mesmo tipo de listener e chama o mesmo método são executados.
Cada módulo do Magento 2 possui seu próprio conjunto de arquivos de configuracão na pasta etc/.
Dependendo das necessidades de seu módulo, você terá os seguintes arquivos de configuração
* acl.xml
* config.xml
* di.xml
* module.xml
* webapi.xml
Devidas a herança da configuração, nos podemos criar um módulo, tornar-lo dependente de um módulo do core e redefinir as preferências para uma certa interface.
Arquivos de configuracão de módulos carregados posteriormente, podem alterar os valores declarados por uma configuração carregada anteriormente.
Pos isto especificar a sequência é importante.
A herança de configuração envolve operações dispendiosas no runtime.
A ferramenta de compilação pode ser usada para minimizar o impacto na performance dessas operações.