

この記事では、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.php | checkout_directpost_placeOrder |
app/code/Magento/Backend/Block/System/Store/Edit/AbstractForm.php | adminhtml_store_edit_form_prepare_form |
app/code/Magento/Backend/Block/Template.php | adminhtml_block_html_before |
app/code/Magento/Backend/Block/Widget/Grid.php | backend_block_widget_grid_prepare_grid_before |
app/code/Magento/Backend/Console/Command/CacheCleanCommand.php | adminhtml_cache_flush_system |
app/code/Magento/Backend/Console/Command/CacheFlushCommand.php | adminhtml_cache_flush_all |
app/code/Magento/Backend/Controller/Adminhtml/Cache/CleanImages.php | clean_catalog_images_cache_after |
app/code/Magento/Backend/Controller/Adminhtml/Cache/CleanMedia.php | clean_media_cache_after |
app/code/Magento/Backend/Controller/Adminhtml/Cache/CleanStaticFiles.php | clean_static_files_cache_after |
app/code/Magento/Backend/Controller/Adminhtml/Cache/FlushAll.php | adminhtml_cache_flush_all |
app/code/Magento/Backend/Controller/Adminhtml/Cache/FlushSystem.php | adminhtml_cache_flush_system |
app/code/Magento/Backend/Controller/Adminhtml/System/Design/Save.php | theme_save_after |
app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteStorePost.php | store_delete |
app/code/Magento/module-backend/Controller/Adminhtml/System/Store/Save.php | store_edit |
app/code/Magento/module-backend/Controller/Adminhtml/System/Store/Save.php | store_add |
app/code/Magento/Backend/Controller/Adminhtml/System/Store/Save.php | store_group_save |
app/code/Magento/Backend/Controller/Adminhtml/System/Store/Save.php | NO_MATCH |
app/code/Magento/Backend/Model/Auth.php | backend_auth_user_login_success |
app/code/Magento/Backend/Model/Auth.php | backend_auth_user_login_failed |
上記のものはただいくつかの例です。
他に何かご質問があれば、ご連絡くださいませ。