Magentoめも

Magento2 イベントをObserverで検知する

Magento2内ではいわゆるフックポイントがあちこちに仕掛けられています。

例えばこんな感じ。

$this->_eventManager->dispatch('sales_order_place_after', ['order' => $this]);

Observerにてこれをフックし、拡張することができるようです。

events.xmlの定義

vendor\magento\module-catalog\Controller\Category\View.php に設定されている catalog_controller_category_init_after イベントをフックします。

events.xml を設置するパスは管理画面だと adminhtml、公開画面だと frontend となります。

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="catalog_controller_category_init_after">
        <observer name="yassujp_helloworld_catalog_controller_category_init_after" instance="Yassujp\HelloWorld\Observer\MyObserver" />
    </event>
</config>

Observerクラスの実装

Observerクラスは Observer フォルダ以下に設置します。

dispatchで渡された変数は $observer->getEvent() で取得できるみたいです。

Observer/MyObserver.php

<?php

namespace Yassujp\HelloWorld\Observer;

use Magento\Framework\Event\ObserverInterface;

class MyObserver implements ObserverInterface
{
    public function __construct()
    {
    }

    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $category = $observer->getEvent()->getCategory();
        echo $category->getName().' Local';
    }
}

これでカテゴリページを閲覧したときに、左上に表示している カテゴリ名 Local と表示されていることが確認できます。

既存のObserverの無効化

コアに定義されているObserverを無効化することもできるようです。
typeの値に disabled を指定してみましょう。

参考
http://devdocs.magento.com/guides/v2.0/extension-dev-guide/events-and-observers.html


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-09-19 (日) 19:09:24