How to Create Events and Observer in Magento 2
In this example we will should you How to create events in Magento 2, we only catch the event to show the word Magetop - Event
on the frontend so we should create an events.xml
file in etc/frontend
folder.
Overview of creating events in Magento 2
- Step 1: Dispatch event
- Step 2: Create a event file: events.xml
- Step 3: Create Observer class
- Step 4: Flush cache and check the result
Understand Catching and handling a event
Magento use area definition to manage the store. We will have a frontend area and admin area. With the configuration file, they can be put in 3 places:
- Under
etc/
folder is the configuration which can be used in both admin and frontend. - Under
etc/frontend
folder will be used for frontend area. - Under
etc/adminhtml
folder will be used for admin area.
The same with the event configuration file. You can create events configuration file for each area like this:
- Admin area:
app/code/Magetop/HelloWorld/etc/adminhtml/events.xml
- Frontend area:
app/code/Magetop/HelloWorld/etc/frontend/events.xml
- Global area:
app/code/Magetop/HelloWorld/etc/events.xml
Step 1: Dispatch event
Now we want to dispatch an magento 2 event list which allow other module can change the word displayed. We will change the controller like this:
File: app/code/Magetop/HelloWorld/Controller/Index/Test.php
Content would be:
<?php
namespace Magetop\HelloWorld\Controller\Index;
class Test extends \Magento\Framework\App\Action\Action
{
public function execute()
{
$textDisplay = new \Magento\Framework\DataObject(array('text' => 'Magetop'));
$this->_eventManager->dispatch('magetop_helloworld_display_text', ['magetop_text' => $textDisplay]);
echo $textDisplay->getText();
exit;
}
}
The dispatch method will receive 2 arguments: an unique event name and an array data. In this example, we add the data object to the event and call it back to display the text.
Step 2: Create a event file: events.xml
File: app/code/Magetop/HelloWorld/etc/frontend/events.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="magetop_helloworld_display_text">
<observer name="magetop_display_text" instance="Magetop\HelloWorld\Observer\ChangeDisplayText" />
</event>
</config>
In this file, under config element, we define an event element with the name is the event name which was dispatch above. The class which will execute this event will be define in the observer element by instance attribute. The name of observer is used to identify this with other observers of this event.
With this events.xml
file, Magento will execute class Magetop
\HelloWorld\Observer\ChangeDisplayText
whenever the dispatch method of this event was called on frontend area. Please note that, we place events.xml
in the frontend area, so if you dispatch that event in the admin area (like admin controller), it will not run.
Step 3: Create Observer class
Now we will create a class to execute above event.
File: app/code/Magetop/HelloWorld/Observer/ChangeDisplayText.php
<?php
namespace Magetop\HelloWorld\Observer;
class ChangeDisplayText implements \Magento\Framework\Event\ObserverInterface
{
public function execute(\Magento\Framework\Event\Observer $observer)
{
$displayText = $observer->getData('magetop_text');
echo $displayText->getText() . " - Event </br>";
$displayText->setText('Execute event successfully.');
return $this;
}
}
This class will implement the ObserverInterface
and declare the execute method. You can see this simple method to know how it work.
Step 4: Flush cache and check the result
Let’s flush cache and see the result.
It comes to the end of the tutorials: How to Create Events and Observer in Magento 2
We hope this is useful blog for you.
Thank you for reading!