Trabalhar com events (eventos) e observers (observadores) é uma das principais maneiras de estender a funcionalidade do Magento. A implementação de events e observers no Magento 2 é baseada no padrão de publish-subscribe pattern. Usando events e observers, você pode executar seu código personalizado em resposta a um evento específico do Magento ou até mesmo um evento personalizado.
Eventos
Eventos são disparados por módulos quando certas ações são acionadas. Além de seus próprios eventos, o Magento permite que você crie seus próprios eventos que podem ser enviados em seu código. Quando um evento é enviado, ele pode passar dados para qualquer observador (observer) configurado para assistir a esse evento.
Disparando Eventos
Eventos podem ser disparados usando a classe Magento\Framework\Event\Manager
. Esta classe pode ser obtida através da injeção de dependência, definindo a dependência em seu construtor.
Para disparar um evento, chame a função dispatch
da classe do Event Manager e forneça o nome do evento que você deseja disparar junto com um array que você deseja fornecer aos observers.
O exemplo a seguir mostra como despachar um evento com e sem um array.
namespace MyCompany\MyModule; use Magento\Framework\Event\ObserverInterface; class MyClass { /** * @var EventManager */ private $eventManager; public function __construct(\Magento\Framework\Event\Manager $eventManager) { $this->eventManager = $eventManager; } public function something() { $eventData = null; // Code... $this->eventManager->dispatch('my_module_event_before'); // More code that sets $eventData... $this->eventManager->dispatch('my_module_event_after', ['myEventData' => $eventData]); } }
Criando Novos Eventos
Eventos personalizados podem ser disparados simplesmente passando um nome de evento exclusivo para o Event Manager quando você chamar a função dispatch
. O evento dever ter um nome único e é referenciado no arquivo events.xml
do seu módulo, onde você especifica quais observers reagirão a esse evento.
Áreas de Eventos
Geralmente, a localização do arquivo events.xml
estará no diretório /etc
do seu módulo. Observers que estão associados a eventos aqui assistirão a esses eventos globalmente. O events.xml
também pode ser definido sob os diretórios /etc/frontend
e /etc/adminhtml
para configurar os observers específicos do frontend e adminhtml.
Observers
Observers são um certo tipo de classe Magento que pode influenciar o comportamento geral, o desempenho ou alterar a lógica de negócios. Observers são executados sempre que o evento que eles estão configurados para assistir é disparado pelo Event Manager.
Criando um Observer
Para criar um observer, você deve colocar o seu arquivo de classe dentro do diretório Observer
. Sua classe deverá implementar a interface
Magento\Framework\Event\ObserverInterface e definir a sua função execute()
, conforme exemplo abaixo:
namespace MyCompany\MyModule\Observer; use Magento\Framework\Event\ObserverInterface; class MyObserver implements ObserverInterface { public function __construct() { // Observer initialization code... // You can use dependency injection to get any class this observer may need. } public function execute(\Magento\Framework\Event\Observer $observer) { // Observer execution code... } }
Uma das características mais poderosas dos observers é que eles são capazes de usar parâmetros passados para o evento quando foram disparados. Abaixo está um exemplo de um observador obtendo dados passados de um evento disparado.
namespace MyCompany\MyModule\Observer; use Magento\Framework\Event\ObserverInterface; class AnotherObserver implements ObserverInterface { public function __construct() { // Observer initialization code... // You can use dependency injection to get any class this observer may need. } public function execute(\Magento\Framework\Event\Observer $observer) { $myEventData = $observer->getData('myEventData'); // Additional observer execution code... } }
Inscrevendo-se em Eventos
Os observers podem ser configurados para assistir a determinados eventos no arquivo events.xml
. O elemento observer do xml tem as seguintes propriedades:
- name (obrigatório): O nome do observer para a definição do evento
- instance (obrigatório): O nome completo da classe do observer.
- disabled – Determina se este observer está ativo ou não. O valor padrão é false.
- shared – Determina o lifecycle da classe. O valor padrão é false
Abaixo está um exemplo de como configurar o observer no seu xml:
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd"> <event name="my_module_event_before"> <observer name="myObserverName" instance="MyCompany\MyModule\Observer\MyObserver" /> </event> <event name="my_module_event_after"> <observer name="myObserverName" instance="MyCompany\MyModule\Observer\AnotherObserver" /> </event> </config>
No exemplo anterior, atribuímos o observer MyObserver
ao evento personalizado my_module_event_before
e AnotherObserver
a my_module_event_after
.
Os nomes dos observers devem ser exclusivos por definição de evento. Isso significa que você não pode ter dois observers com o mesmo nome na mesma definição de evento. No exemplo, os dois observers têm o nome myObserverName
. Isso é aceitável porque cada um desses observers pertence a diferentes definições de eventos.
Boas Práticas com Observers
Faça seu Observer eficiente
Tente manter seu observer pequeno e eficiente, evitando cálculos complexos, se possível. Isso é especialmente importante quando o observer está ouvindo um evento que é enviado frequentemente. Ter cálculos complexos em seu observer pode retardar os processos de aplicativos.
Não Inclua Lógica de Negócios
Seu observer não deve conter lógica diferente do que é necessário para ser executado. A lógica de negócios deve ser encapsulada em outras classes que seu observer usa.
Declarar Observer no Escopo Apropriado
Faça o seu observer tão específico quanto ele precisa ser. Declare seu observer no escopo apropriado:
- Para eventos frontend, declare observadores em
<module-dir>/etc/frontend/events.xml
- Para eventos de backend, declare observadores em
<module-dir>/etc/adminhtml/events.xml
Use o <module-dir>/etc/events.xml
somente quando um evento puder ocorrer no frontend e no backend.
Evite Loops de Eventos Cíclicos
Loops de eventos cíclicos ocorrem quando o observer chama o método de um objeto que dispara um evento que aciona uma cadeia de eventos que acaba disparando o mesmo evento inicial que executa seu observer de maneira recorrente. Certifique-se de que seu observer não esteja disparando um evento que imediatamente ouve na cadeia de eventos que se segue.
Não Confie na Ordem de Invocação
Seu observer não deve fazer suposições sobre a ordem na qual ele será invocado, nem deve depender da execução de outro observer. Observers ouvindo o mesmo evento podem ser invocados em qualquer ordem quando esse evento for disparado.
Mais sobre Events e Observers e Boas Práticas com Observers.
Dúvidas? Posta aí!!!
Um abraço.