在Magento 2 事件列表中,我们可以使用该类Magento\Framework\Event\Manager
来调度事件。例如,我们在 Mageplaza_HelloWorld 中创建一个控制器动作来在屏幕上显示单词“Hello World”:
文件:app/code/Mageplaza/HelloWorld/Controller/Index/Test.php
<?php namespace Mageplaza\HelloWorld\Controller\Index; class Test extends \Magento\Framework\App\Action\Action { public function execute() { echo "Hello World"; exit; } }
现在我们要调度一个Magento 2 事件列表,它允许其他模块可以更改显示的单词。我们将像这样更改控制器:
文件:app/code/Mageplaza/HelloWorld/Controller/Index/Test.php
<?php namespace Mageplaza\HelloWorld\Controller\Index; class Test extends \Magento\Framework\App\Action\Action { public function execute() { $textDisplay = new \Magento\Framework\DataObject(array('text' => 'Mageplaza')); $this->_eventManager->dispatch('mageplaza_helloworld_display_text', ['mp_text' => $textDisplay]); echo $textDisplay->getText(); exit; } }
dispatch 方法将接收 2 个参数:一个唯一的事件名称和一个数组数据。在本例中,我们将数据对象添加到事件中并回调它以显示文本。
Magento 使用区域定义来管理商店。我们将有一个前端区域和管理区域。使用配置文件,它们可以放在 3 个地方:
文件夹下etc/
是可以在管理和前端使用的配置。
文件夹下etc/frontend
将用于前端区域。
文件夹下etc/adminhtml
将用于管理区域。
与事件配置文件相同。您可以像这样为每个区域创建事件配置文件:
行政区:app/code/Mageplaza/HelloWorld/etc/adminhtml/events.xml
前端区域:app/code/Mageplaza/HelloWorld/etc/frontend/events.xml
全球区域:app/code/Mageplaza/HelloWorld/etc/events.xml
在此示例中,我们仅捕获事件以Mageplaza - Event
在前端显示单词,因此我们应该在文件夹中创建一个events.xml
文件etc/frontend
。
文件:app/code/Mageplaza/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="mageplaza_helloworld_display_text"> <observer name="mp_display_text" instance="Mageplaza\HelloWorld\Observer\ChangeDisplayText" /> </event> </config>
在这个文件中,在 config 元素下,我们定义了一个事件元素,其名称是上面调度的事件名称。将执行此事件的类将通过实例属性在观察者元素中定义。观察者的名称用于与该事件的其他观察者进行识别。
有了这个文件,每当在前端区域调用这个事件的调度方法时events.xml
,Magento 就会执行类。Mageplaza\HelloWorld\Observer\ChangeDisplayText
请注意,我们放置events.xml
在前端区域,因此如果您在管理区域(如管理控制器)中调度该事件,它将不会运行。
现在我们将创建一个类来执行上述事件。
文件:app/code/Mageplaza/HelloWorld/Observer/ChangeDisplayText.php
<?php namespace Mageplaza\HelloWorld\Observer; class ChangeDisplayText implements \Magento\Framework\Event\ObserverInterface { public function execute(\Magento\Framework\Event\Observer $observer) { $displayText = $observer->getData('mp_text'); echo $displayText->getText() . " - Event </br>"; $displayText->setText('Execute event successfully.'); return $this; } }
此类将实现ObserverInterface
并声明执行方法。你可以看到这个简单的方法来了解它是如何工作的。