Magento 2のイベントリストとその利用方法

この記事では、Magento 2イベントを使用する方法を紹介します。 しかし、その前にイベントとオブザーバーについて理解する必要があります。Magento 2 のイベントとオブザーバーの実装は、publish-subscribe パターンに基づいています。イベントとオブザーバーを使うと、特定のMagentoイベントやカスタムイベントに応答して、カスタムコードを実行することができます。

Magentoイベントとは?

イベントは、特定のアクションがトリガーされたときにモジュールによってディスパッチされます。独自のイベントに加えて、Magento ではコード内でディスパッチできる独自のイベントを作成することができます。イベントがディスパッチされると、そのイベントを監視するように設定されたオブザーバーにデータを渡すことができます。

Magento のオブザーバーとは?

オブザーバーとは、一般的な動作やパフォーマンスに影響を与えたり、ビジネスロジックを変更したりすることができる、Magento のある種のクラスです。オブザーバーは、監視するように設定されているイベントイベントマネージャによってディスパッチされるたびに実行されます。

専門用語を理解したところで、実際に使ってみましょう。

1.「event.xml」ファイル作成

  • グローバルエリア: app/code/Simi/HelloWorld/etc/events.xml
  • フロントエンドエリア: app/code/Simi/HelloWorld/etc/frontend/events.xml
  • アドミンエリア: app/code/Simi/HelloWorld/etc/adminhtml/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="my_module_event_before">
        <observer name="myObserverName" instance="MyCompany\MyModule\Observer\MyObserver" />
    </event>
    <event name="my_module_event_after">
        <observer name="myObserverName" instance="MyCompany\MyModule\Observer\AnotherObserver" />
    </event>
</config>

2.オブザーバクラスの作成

オブザーバーを作成するには、クラスファイルを /Observer ディレクトリに配置する必要があります。オブザーバークラスは、MagentoFramework\Event\ObserverInterfaceを実装し、実行関数を定義します。

以下に、基本的なオブザーバークラスの構成例を示します。

namespace MyCompany\MyModule\Observer;
use Magento\Framework\Event\ObserverInterface;
class MyObserver implements ObserverInterface
{
  public function __construct()
  {
    // Observer initialization code...
    // You can use dependency injection to get any class this observer may need.
  }
  public function execute(\Magento\Framework\Event\Observer $observer)
  {
    // Observer execution code...
  }
}

オブザーバーの強力な機能のひとつに、イベントがディスパッチされたときに渡されたパラメータを使用できるというものがあります。

ここでは、イベントがディスパッチされたときに渡されたデータをオブザーバーが取得する例を紹介します。

namespace MyCompany\MyModule\Observer;
use Magento\Framework\Event\ObserverInterface;
class AnotherObserver implements ObserverInterface
{
  public function __construct()
  {
    // Observer initialization code...
    // You can use dependency injection to get any class this observer may need.
  }
  public function execute(\Magento\Framework\Event\Observer $observer)
  {
    $myEventData = $observer->getData('myEventData');
    // Additional observer execution code...
  }
}

イベントの購読

オブザーバーは、events.xmlファイルで特定のイベントを監視するように設定できます。

observer xml要素のプロパティは次のとおりです。

  • name (必須): イベント定義用のオブザーバーの名前です。
  • instance (必須) : オブザーバーの完全修飾クラス名。
  • disabled : このオブザーバーがアクティブであるかどうかを決定します。既定値はfalseです。
  • shared :このクラスのライフスタイルを決定します。既定値はtrueです。

以下は、特定のイベントを監視するオブザーバーを割り当てる方法の例です。

<?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="my_module_event_before">
        <observer name="myObserverName" instance="MyCompany\MyModule\Observer\MyObserver" />
    </event>
    <event name="my_module_event_after">
        <observer name="myObserverName" instance="MyCompany\MyModule\Observer\AnotherObserver" />
    </event>
</config>

オブザーバーの名前は、イベント定義ごとに一意でなければならないことに注意してください。オーバーライドを避けるために、同じイベント定義に同じ名前のオブザーバーを2つ置くことはできません。

3.イベントのディスパッチ

イベントのディスパッチには、Magento®Event®Manager クラスを使用します。このクラスは、コンストラクタに依存関係を定義することで、ディペンデンシー・インジェクションによって取得できます。

イベントをディスパッチするには、イベントマネージャークラスの dispatch 関数を呼び出し、ディスパッチしたいイベントの名前とオブザーバーに提供したいデータの配列を指定します。

次の例では、データの配列を指定した場合と指定しない場合のイベントのディスパッチ方法を示します。

namespace MyCompany\MyModule;
use Magento\Framework\Event\ManagerInterface as EventManager;
class MyClass
{
  /**
   * @var EventManager
   */
  private $eventManager;
  public function __construct(EventManager $eventManager)
  {
    $this->eventManager = $eventManager;
  }
  public function something()
  {
    $eventData = null;
    // Code...
    $this->eventManager->dispatch('my_module_event_before');
    // More code that sets $eventData...
    $this->eventManager->dispatch('my_module_event_after', ['myEventData' => $eventData]);
  }
}
ファイル
イベント
app/code/Magento/Authorizenet/Controller/Directpost/Payment/Place.phpcheckout_directpost_placeOrder
app/code/Magento/Backend/Block/System/Store/Edit/AbstractForm.phpadminhtml_store_edit_form_prepare_form
app/code/Magento/Backend/Block/Template.phpadminhtml_block_html_before
app/code/Magento/Backend/Block/Widget/Grid.phpbackend_block_widget_grid_prepare_grid_before
app/code/Magento/Backend/Console/Command/CacheCleanCommand.phpadminhtml_cache_flush_system
app/code/Magento/Backend/Console/Command/CacheFlushCommand.phpadminhtml_cache_flush_all
app/code/Magento/Backend/Controller/Adminhtml/Cache/CleanImages.phpclean_catalog_images_cache_after
app/code/Magento/Backend/Controller/Adminhtml/Cache/CleanMedia.phpclean_media_cache_after
app/code/Magento/Backend/Controller/Adminhtml/Cache/CleanStaticFiles.phpclean_static_files_cache_after
app/code/Magento/Backend/Controller/Adminhtml/Cache/FlushAll.phpadminhtml_cache_flush_all
app/code/Magento/Backend/Controller/Adminhtml/Cache/FlushSystem.phpadminhtml_cache_flush_system
app/code/Magento/Backend/Controller/Adminhtml/System/Design/Save.phptheme_save_after
app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteStorePost.phpstore_delete
app/code/Magento/module-backend/Controller/Adminhtml/System/Store/Save.phpstore_edit
app/code/Magento/module-backend/Controller/Adminhtml/System/Store/Save.phpstore_add
app/code/Magento/Backend/Controller/Adminhtml/System/Store/Save.phpstore_group_save
app/code/Magento/Backend/Controller/Adminhtml/System/Store/Save.phpNO_MATCH
app/code/Magento/Backend/Model/Auth.phpbackend_auth_user_login_success
app/code/Magento/Backend/Model/Auth.phpbackend_auth_user_login_failed

上記のものはただいくつかの例です。

他に何かご質問があれば、ご連絡くださいませ。

デモを申し込む

弊社の専門家は最適なソリューションをサポートさせて頂きます。

►►►サービスについて