Dando prosseguimento aos nossos estudos sobre Event Manager, desta vez veremos como criar um evento customizado em Magento 2 Events – Parte 2.
Às vezes, os eventos que já existem no Magento 2 não são suficiente para as nossas regras de negócio. Com isso, podemos precisar de um evento customizado.
Voltando ao nosso módulo, temos a seguinte alteração em nosso Controller:
<?php namespace ForMage\Learning\Controller\Page; use Magento\Framework\App\Action\Context; use Magento\Framework\App\ResponseInterface; use ForMage\Learning\Api\SizeInterface; use ForMage\Learning\Api\ColorInterface; use ForMage\Learning\Model\Product\Shoe; use ForMage\Learning\Model\Product\Shirt; use Magento\Framework\Event\ManagerInterface; class Index extends \Magento\Framework\App\Action\Action { protected $size; protected $color; protected $product; protected $shirt; protected $eventManager; public function __construct( Context $context, SizeInterface $size, ColorInterface $color, Shoe $product, Shirt $shirt, ManagerInterface $eventManager ) { parent::__construct($context); $this->size = $size; $this->color = $color; $this->product = $product; $this->shirt = $shirt; $this->eventManager = $eventManager; } public function execute() { $message = new \Magento\Framework\DataObject(array('custom_text' => 'That is my FIRST custom text')); echo $message->getCustomText(); } }
Acessando a nossa rota temos:
O que nós fizemos acima? Usamos o DataObject do Magento para armazenar um valor na key custom_text e depois imprimimos esse valor.
Magento 2 Events – Parte 2
Ainda em nosso Controller, temos a seguinte modificação no método execute()
:
public function execute() { $message = new \Magento\Framework\DataObject(array('custom_text' => 'That is my FIRST custom text')); $this->eventManager->dispatch('my_custom_event_name', ['custom_text' => $message]); echo $message->getCustomText(); }
Note que estamos usando o Event Manager para criar um evento customizado com o nome de my_custom_event_name. Como segundo parâmetro do método dispatch()
temos a nossa key custom_text armazenando o objecto $message
.
Em nosso events.xml temos a seguinte alteração:
<?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_login"> <observer name="myObserverName" instance="ForMage\Learning\Model\Observer\Observer" /> </event> <event name="my_custom_event_name"> <observer name="myCustomEventName" instance="ForMage\Learning\Model\Observer\CustomObserver" /> </event> </config>
<event name="my_custom_event_name"
assim estamos falando para o Magento 2 que queremos ouvir esse evento quando ele for disparado.
<observer name="myCustomEventName"
nome do nosso Observer.
<observer instance="ForMage\Learning\Model\Observer\CustomObserver" />
–> nossa classe Observer.
Então, criamos o nosso CustomObserver:
<?php namespace ForMage\Learning\Model\Observer; use Magento\Framework\Event\ObserverInterface; class CustomObserver implements ObserverInterface { /** * @param \Magento\Framework\Event\Observer $observer */ public function execute(\Magento\Framework\Event\Observer $observer) { $message = $observer->getData('custom_text'); $message->setCustomText('That is my SECOND custom text'); } }
Entendendo todo o processo
Em nosso Controller, criamos o evento customizado my_custom_event_name. Esse evento será disparado quando o controller for acessado. Em nosso etc/frontend/events.xml, informamos ao Magento 2 qual o evento que queremos “ouvir” e qual será o Observer executado ao “ouvir” o evento disparado. Em nosso CustomObserver interceptamos o objeto $message
e efetuamos uma modificação nele.
Ao acessar a nossa rota novamente, temos o seguinte resultado: