
この例では、Magento 2でイベントを作成する方法を説明します。フロントエンドに「Mageplaza – Event」という文字を表示するイベントをキャッチするだけなので、etc/frontendフォルダにevents.xmlファイルを作成する必要があります。
目次
イベントの捕捉と処理の理解
Magentoはストアを管理するためにエリア定義を使用します。フロントエンドエリアと管理者エリアを用意します。設定ファイルを使えば、それらを3つの場所に置くことができます:
- etc/フォルダの下には、adminとfrontendの両方で使用できる設定があります。
- etc/frontendフォルダの下は、フロントエンドエリアに使用されます。
- etc/adminhtmlフォルダの下は、adminエリアに使用されます。
イベント設定ファイルも同様です。このようにエリアごとにイベント設定ファイルを作成することができます。
- 管理者エリア:app/code/Mageplaza/HelloWorld/etc/adminhtml/events.xml
- フロントエンドエリア:app/code/Mageplaza/HelloWorld/etc/frontend/events.xml
- グローバルエリア:app/code/Mageplaza/HelloWorld/etc/events.xml
ステップ1:イベントの発信
ここでは、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;
}
}
ディスパッチメソッドは、ユニークなイベント名と配列データの2つの引数を受け取ります。この例では、データオブジェクトをイベントに追加し、それをコールバックしてテキストを表示しています。
ステップ2:イベントファイル(events.xml)の作成
ファイル: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要素の下に、上でディスパッチしたイベント名を名前とするイベント要素を定義しています。このイベントを実行するクラスは、observer要素のinstance属性で定義します。オブザーバーの名前は、このイベントの他のオブザーバーとの識別に使用されます。
この events.xml ファイルにより、Magento は、このイベントの dispatch メソッドがフロントエンドで呼び出されると、Mageplaza\HelloWorld\Observer\ChangeDisplayText クラスを実行します。なお、Events.xmlはフロントエンドエリアに配置していますので、管理者エリア(管理コントローラなど)でイベントをディスパッチしても実行されません。
ステップ3:Observerクラスの作成
それでは、上記イベントを実行するクラスを作成します。
ファイル: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を実装し、executeメソッドを宣言します。この簡単なメソッドを見て、どのように動作するかを知ることができます。
ステップ4:キャッシュのフラッシュと結果の確認
キャッシュをフラッシュして結果を見てみましょう。
