Cursos Magento

Eventos e Observers no Magento 2

,

Publicado em 02 de abril de 2019

Assim como no Magento 1, o novo Magento 2 também faz uso de eventos e observers em vários lugares.

O que são Events e Observers?

Eventos são pontos de interrupção inseridos em classes PHP que buscam por outras classes que estejam escutando aquela interrupção.

Os eventos existem em lugares estratégicos, como por exemplo, na finalização de um pedido, ou no registro de um novo cliente.

Já os Observers, são classes que observam estes eventos e recebem parâmetros passados pelos eventos.

Para que servem? O que mudou no Magento 2?

No Magento 1 os Observers eram a forma mais segura de se modificar funcionalidades nativas no Magento. Isso porque a classe que observa um evento, recebe parâmetros passados por ele, e pode modificá-los.

Desta forma, se quiséssemos por exemplo alterar a forma como um preço é calculado para exibição, bastaria criar um observer no evento que calcula o preço, e modificar o parâmetro [preço] enviado para nossa classe usando a nossa lógica.

Recomendação

No Magento 2 a recomendação é que usemos Plugins (abordado no curso de Magento 2) para a maioria das modificações.

Os Observers e Eventos continuam disponíveis no Magento 2, mas as novas boas práticas sugerem que não devem ser usados para modificar o comportamento da loja ou suas funcionalidades. Idealmente usamos Observers para tarefas de baixa complexidade e que não dependam de serviços ou requisições externas.

Opinião pessoal

Particularmente, gosto de usar Observers para integrações, porém enviando os dados a serem integrados para algum sistema de fila (ou mesmo tabela de fila) e tratar as integrações posteriormente via cron (tarefas agendadas).

Se você fez o curso de criação de módulos para Magento 1, lembra do sistema de integração com filas que criamos. Uso a mesma abordagem no Magento 2.

 

Criando um Observer

Para criar um Observer, precisamos:

  1. Criar uma classe que implemente Magento\Framework\Event\ObserverInterface e defina um método execute().
  2. Criar um arquivo events.xml na área adequada ao evento que queremos observar

Exemplo

Neste exemplo vou assumir que você já tem um módulo Magento 2 criado. No nosso caso, o nome do módulo será o Magenteiro_Observer, e ele escutará o evento customer_save_after_data_object.

Este evento é chamado sempre que um cliente é salvo ou modificado no Magento, e nos dá detalhes dos dados do cliente antes e depois dele ser salvo. Utilizei este evento em um outro módulo, onde precisava integrar clientes novos com outro sistema.

<?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="customer_save_after_data_object">
        <observer name="meu_observer_cliente_salvo" instance="Magenteiro\Observer\Observer\CustomerRegister"/>
    </event>
</config>

Note que o arquivo events.xml pode ser colocado em 3 lugares diferentes, e isso pode impactar na performance da sua loja.
  • app/etc/events.xml – Lido nas ações do frontend e do admin da loja
  • app/etc/adminhtml/events.xml – Lido somente para eventos que acontecem no admin da loja
  • app/etc/frontend/events.xml – Lido somente nos eventos da frente de loja

Note ainda que na linha 4, onde defino meu observer, temos 2 parâmetros obrigatórios e outros 2 opcionais:

  • name (obrigatório)- identificador único do meu Observer
  • instance (obrigatório)- caminho completo da classe do meu Observer (que vamos criar em seguida)
  • disabled (opcional) – se desejar desabilitar este Observer, passe “true” como valor. O padrão é false mesmo, fazendo com que ele seja executado.
  • shared (opcional) – determina se uma nova instância da classe do observer será criada, ou se ele irá aproveitar uma classe já instanciada (caso exista). O padrão é false, fazendo criar uma nova classe. (dévà vu vu para quem lembra dos Singletons do Magento 1)

<?php
namespace Magenteiro\Observer\Observer;

use Magento\Framework\Event\ObserverInterface;

/**
 * Class Customer
 *
 * @author    Ricardo Martins <[email protected]>
 * @copyright 2019 Magenteiro.com
 * @package   Magenteiro\Observer\Observer
 */
class CustomerRegister implements ObserverInterface
{
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        //Determina se o cliente é novo ou não quando os dados anteriores não existiam
        $isNewCustomer = $observer->getData('orig_customer_data_object') === null;
        
        if (!$isNewCustomer) {
            return; //não me interesso pelos dados de clientes existente neste caso
        }

        $customer = $observer->getData('customer_data_object');
        $customerData = [
            'first_name' => $customer->getFirstname(),
            'last_name' => $customer->getLastname(),
            'email' => $customer->getEmail(),
            ];
        // ... envio o cliente pra fila de integração
    }
}

Lista de eventos disponíveis no Magento 2

Alguns eventos são definidos de forma dinâmica, e seus nomes podem variar de acordo com a situação.

No entanto a maioria deles possuí nome fixo e podem ser encontrados ao buscar por ->dispatch ou fazer um grep em todos os arquivos do seu Magento:

grep -Rn 'eventManager->dispatch(' <pasta_magento>

 

E aí? Quer mais?

De onde veio este conteúdo tem muito mais. Confira os meus cursos e comunidades Magento aqui mesmo no Magenteiro.com.

 

 

Foto de destaque por Brian van den Heuvel do Pexels
Últimos posts por Ricardo Martins (exibir todos)
Assuntos: | |
Comentários

Deixe seu comentário

[fbcomments url="https://www.magenteiro.com/blog/magento-2/eventos-e-observers-no-magento-2/"]