Design Pattern Events e Observers

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 MyObserverao evento personalizado my_module_event_beforeAnotherObservermy_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.xmlsomente 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.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *