76
Como criar eventos e Observers personalizados no Magento 2
É um padrão de mensagens onde os publicadores das mensagens (Publishers) categorizam as mensagens publicadas em classes sem conhecimentos dos inscritos (Subscribers). Os publicadores não programam as mensagens para serem enviadas diretamente para os inscritos e os inscritos não manifestam interesses em uma ou mais classes e só recebem as mensagens que possuem interesse, sem saber quais publicadores existem.
Os eventos e observadores são baseados no padrão pub-sub, onde eventos são disparados quando certas ações são ativadas, podendo passar dados para qualquer observador configurado para observar o evento.
Observadores são capazes de modificar o comportamento da aplicação, porque são dinamicamente injetados no fluxo da execução.
Observadores são capazes de modificar o comportamento da aplicação, porque são dinamicamente injetados no fluxo da execução.
Utilizar eventos e observadores é uma das principais maneiras de estender as funcionalidades do Magento. Eventos podem impactar em problemas de instabilidade no fluxo do Magento, então é recomendado manter os observadores simples e eficientes (alguns eventos são comumente disparados).
Os observadores não devem possuir lógica de negócio, o observador deve chamar as classes que encapsulam as lógicas de negócio. É recomendado que essas classes que possuam a regra de negócio não disparem eventos, que em cascata, disparem o evento original.
Não abordaremos nesse artigo os escopos de lojas, mas recomendo que sempre que for implementar um observador, busque sobre os escopos e em qual área deve ser aplicado.
Os observadores não devem possuir lógica de negócio, o observador deve chamar as classes que encapsulam as lógicas de negócio. É recomendado que essas classes que possuam a regra de negócio não disparem eventos, que em cascata, disparem o evento original.
Não abordaremos nesse artigo os escopos de lojas, mas recomendo que sempre que for implementar um observador, busque sobre os escopos e em qual área deve ser aplicado.
Eventos podem ser disparados utilizando a classe
Para disparar um evento é utilizado o método
\Magento\Framework\Event\ManagerInterface
. Esta classe pode ser instanciada através de injeção de dependência no construtor.Para disparar um evento é utilizado o método
dispatch()
da classe de gerenciador de eventos passando como parâmetro o nome do evento que você queira disparar e como um segundo parâmetro um array com os dados que deseja disponibilizar para o observador.<?php
namespace {Vendor}\{Module}\{Directory};
use Magento\Framework\Event\ManagerInterface;
class {ClassName}
{
private ManagerInterface $eventManager;
public function __construct(
ManagerInterface $eventManager
) {
$this->eventManager = $eventManager;
}
public function {methodName}(): {type}
{
$this->eventManager->dispatch('{event_name}', ['{paramName}' => $paramName]);
// Code here
}
}
Eventos personalizados podem ser disparados passando o nome do evento para o gerenciador de eventos quando o método
O evento possui um nome único e é referenciado no arquivo
dispatch()
for chamado.O evento possui um nome único e é referenciado no arquivo
events.xml
onde é definido qual será a classe Observer que reagirá a quando o evento for disparado. Esses arquivos devem seguir a estruturas de pastas \{Vendor}\{Module}\etc\{area}\events.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="{event_name}">
<observer name="{observer_name}" instance="{Vendor}\{Module}\Observer\{ObserverName}" />
</event>
</config>
Observadores são classes que afetam e podem influenciar no comportamento geral do sistema, performance ou alteração na regra de negócio. Observadores são sempre executados quando o evento que ele está configurado é chamado pelo gerenciador de eventos através do método
O observador deve seguir a estrutura de pastas
Os observadores são capazes de utilizar parâmetros passados ao disparar os eventos.
dispatch()
.O observador deve seguir a estrutura de pastas
\{Vendor}\{Module}\Observer\{ObserverName}
e deve implementar a classe \Magento\Framework\Event\ObserverInterface
, que obriga a classe a implementar o método execute(\Magento\Framework\Event\Observer $observer)
.Os observadores são capazes de utilizar parâmetros passados ao disparar os eventos.
<?php
namespace {Vendor}\{Module}\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Event\Observer;
class {ObserverName} implements ObserverInterface
{
public function execute(Observer $observer): {type}
{
$observer->getData('{param}');
// Code here
}
}
Valores entre chaves ({test}
) devem ser alterados na implementação do código.
Execute o comando PHP para limpar todos os caches de armazenamento em cache do processos.
php bin/magento cache:clean
php bin/magento flush
Segue a a lista de diretórios e arquivos que devem ser criados.
- app/
- code/
- {Vendor}/
- {Module}/
- etc/
- events.xml
- module.xml
- Observer/
- {Observername}.php
- registration.php
- composer.json
76