步骤:

  • 第1步:派遣事件
  • 第2步:创建一个事件文件:events.xml
  • 第3步:创建Observer类
  • 第4步:刷新缓存并检查结果

派遣事件:

现在我们要调度一个 magento2事件列表,允许其他模块更改显示的单词。app/code/Mageplaza/HelloWorld/Controller/Index/Test.php

app/code/Test/Event/Controller/Index目录中创建 Test.php 并添加如下内容:

<?php
namespace Test\Event\Controller\Index;

use Magento\Framework\App\Action\Action;

class Test extends Action
{
    public function execute()
    {
        $textDisplay = new \Magento\Framework\DataObject(['text' => 'Display Text(t1)']);
        $this->_eventManager->dispatch('test_event_display_text', ['mp_text' => $textDisplay]);

        echo $textDisplay->getText();
        exit;
    }
}

dispatch 方法将接收 2 个参数:唯一的事件名称和数组数据。

在此示例中,我们将数据对象 $textDisplay 添加到事件中。

创建事件文件:

app/code/Test/Event/etc/frontend 目录下创建 events.xml 并添加如下内容:


<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="test_event_display_text">
        <observer name="display_text" instance="Test\Event\Observer\ChangeDisplayText" />
    </event>
</config>

代码中设置的事件名称即是上一步骤中 dispatch() 函数中传入的 eventName。通过instance属性在observer元素中定义将执行此事件的类。观察者的名称用于与此事件的其他观察者区分识别。

创建 Observer 类:

app/code/Test/Event/Observer 目录中创建 ChangeDisplayText.php 并添加如下内容:

<?php
namespace Test\Event\Observer;

use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;

class ChangeDisplayText implements ObserverInterface
{
    public function execute(Observer $observer)
    {
        $displayText = $observer->getData('mp_text');
        echo $displayText->getText() . '<br/>';

        echo 'Begin Change Display Text....<br/>';

        $displayText->setText('Display Text(t2)');

        return $this;
    }

}

该类实现了 ObserverInterface 接口并实现了 execute 方法。

刷新缓存并检查结果:

file