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:
- Criar uma classe que implemente
Magento\Framework\Event\ObserverInterface
e defina um método execute(). - 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 lojaapp/etc/adminhtml/events.xml
– Lido somente para eventos que acontecem no admin da lojaapp/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 Observerinstance
(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.
- Recorrência no WooCommerce Sem Plugins Pagos - 28 de janeiro de 2024
- Chargeback. O que é, e como se livrar deles. - 19 de dezembro de 2023
- Integração PagBank Nova Geração – Um guia rápido - 31 de outubro de 2023
Deixe seu comentário
[fbcomments url="https://www.magenteiro.com/blog/magento-2/eventos-e-observers-no-magento-2/"]