Cursos Magento

Crie seu próprio evento no Magento 2

,

Atualizado em 01 de março de 2022

Events e Observers fazem parte do Magento desde suas primeiras versões. O Magento possuí vários eventos que, ao serem disparados, buscam módulos que acoplaram pontos de observação e executam determinada ação. Eventos são disparados na finalização de um pedido, na emissão de uma fatura, no cadastro de um novo cliente, e em uma centena de outras ocasiões.

Os eventos também permitem que estes observadores alterem o comportamento de determinadas funcionalidades no Magento.

Com a chegada do Magento 2, também temos os Plugins, que nos dão ainda mais flexibilidade, podendo escutar qualquer método do Magento, mesmo que nenhum evento seja disparado. Mas hoje focaremos nos Eventos e Observadores. Saiba mais sobre Plugins no meu curso Magento.

Criando um evento personalizado no Magento 2

A criação de um novo evento é um processo bem simples. Tudo que precisamos fazer é chamar o método dispatch da classe \Magento\Framework\Event\ManagerInterface com um nome do nosso evento. Preferencialmente, um nome único.

Ficaria mais ou menos assim:

namespace Magenteiro\Modulo;

class MinhaClasse
{
  /**
   * @var \Magento\Framework\Event\ManagerInterface
   */
  private $eventManager;

  /*
   * @param \Magento\Framework\Event\ManagerInterface EventManager
   */
  public function __construct(\Magento\Framework\Event\ManagerInterface $eventManager)
  {
    $this->eventManager = $eventManager;
  }

  public function enviaPedidoERP()
  {
    $pedidoErp = null;
    // disparamos um evento no começo por exemplo...
    $this->eventManager->dispatch('pedido_enviado_erp_inicio');
    // Integramos com o erp, e obtemos o retorno, salvamos em $pedidoErp...etc
    $this->eventManager->dispatch('pedido_gravado_erp', ['erpId' => $pedidoErp]);
  }
}

No exemplo acima podemos ver que criamos dois eventos distintos: pedido_enviado_erp_inicio e pedido_gravado_erp.

Uma vez que os eventos forem criados, qualquer módulo pode escutar estes eventos com o uso de observers. O nome do evento é passado no atributo name dentro do arquivo events.xml, como mostrado neste artigo.

Modificando dados com observers

No segundo exemplo criamos um observer que passa a variável $pedidoErp no atributo erpId para qualquer observer que escutar este evento. Esta variável pode ser de praticamente qualquer tipo, e será resgatada dentro do observer com $observer->getData('erpId').

No entanto, se quisermos ter a possibilidade de modificar este valor dentro de um dos Observers, temos que passar uma instância de \Magento\Framework\DataObject no dispatch.

Veja como ficaria o disparo do evento e como modificamos o valor da variável dentro do observer.

$erpRetorno = new \Magento\Framework\DataObject(['erpId'=>1]);
echo $erpRetorno->getData('erpId'); //resultado: 1
$this->eventManager->dispatch('pedido_gravado_erp', ['erpRetorno'=>$erpRetorno]);
echo $erpRetorno->getData('erpId'); //resultado: 2
public function execute(\Magento\Framework\Event\Observer $observer)
{
    $erpRetorno = $observer->getData('erpRetorno');

    $erpRetorno->setData('erpId', 2);
    return $this;

}

👆Clique nas abas para alternar entre os exemplos.

Boas práticas e considerações

No Magento 1 era comum modificarmos valores e comportamentos com o uso de Observers. No Magento 2, temos os Plugins para nos ajudar nesta tarefa. Falando nisso, há algum tempo era recomendado que não usássemos Observers no Magento 2 para estes fins.

Bom, parece que isso vem mudando e não encontrei mais referências sobre essa limitação. Inclusive até mencionei isso no Magento 2: O Curso.

Eis algumas recomendações que ainda são válidas:

  • Evite adicionar regras de negócio nos seus Observers.
  • Evite criar observers que disparam o mesmo evento novamente. Isso pode causar loops indesejados.
  • Não espere que seu observer seja executado antes de outro, mesmo que defina um valor para ordem de execução.
  • Evite criar eventos em áreas que precisam ser rápidas em sua loja (ex: fluxo de checkout) ou que são chamados com muita frequência. Isso dará margem para que outros desenvolvedores criem observers que tornarão esse processo lento.
  • Evite adicionar chamadas à URL externas ou webservices nos observers, pois atrasará a execução do evento/classe que o chama.

Use eventos nos seus módulos, em especial em áreas que você espera que alguém queira modificar ou customizar no futuro. Isso certamente ajudará futuros desenvolvedores a não precisarem sobrescrever ou modificar nada do seu módulo.

Estudo de caso.

Um exemplo clássico que fiz uso de eventos personalizados foi na criação do módulo PagSeguro para Magento. A obtenção do valor CPF do cliente era algo que poderia vir de vários lugares diferentes. Cada loja tem uma implementação diferente.

Por mais que tenha oferecido a opção de escolher um atributo de cliente existente, é possível que o CPF venha de algum lugar não mapeado, ou que eu não previ.

Neste caso, a criação de um evento como o acima permitiria que qualquer desenvolvedor possa implementar uma lógica diferente para obter este valor sem ter que modificar meu módulo, o que dificultaria futuras atualizações.

Como comentei, isso também poderia ser feito com o uso de Plugins, caso eu tivesse um método getCPF por exemplo. Mas isso é assunto para outro artigo (e já foi bem abordado no Magento 2: O Curso).

Veja também: como escutar eventos existentes no Magento 2 e como obter lista dos eventos disponíveis.

Últimos posts por Ricardo Martins (exibir todos)
Comentários

Deixe seu comentário

[fbcomments url="https://www.magenteiro.com/blog/magento-2/criar-evento-personalizado/"]