Magento 2 事件處理 (中) — 自定義事件
Magento 內建有許多的事件 ( Event ),其實使用起來非常方便,上次我們介紹了如何使用官方的事件以及如何使用參數,今天就我們來看看自定義事件的用法吧!
1.在 Controller 內產生事件 ( Event )
這次示範,以我們常用的 Controller 為例,依照底下程式碼新增一個 Controller。
其中,我們可以看到在 41 行的部分,我們呼叫了一個自定義的事件,並且命名為 sample_controller_before_execute。目前到這裡為止,已經完成 99% 了。我們可以知道,只要有正確的繼承到 Magento 原生的 Action Class 皆可以直接使用 _eventManager 來管理事件。
<?php
namespace Grayson\Post\Controller\Index;
use Magento\Framework\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;
use Magento\Framework\App\Action\Action;
/**
* Class Index
* @package Grayson\Post\Controller\Index\Index
*/
class Index extends Action
{
/**
* Index resultPageFactory
* @var PageFactory
*/
protected $resultPageFactory;
/**
* Index constructor.
* @param Context $context
* @param PageFactory $resultPageFactory
*/
public function __construct(Context $context, PageFactory $resultPageFactory)
{
$this->resultPageFactory = $resultPageFactory;
return parent::__construct($context);
}
/**
* Function execute
* @return \Magento\Framework\View\Result\Page
*/
public function execute()
{
$this->_eventManager->dispatch(
'sample_controller_before_execute',
[
'controller' => $this
]);
return $this->resultPageFactory->create();
}
}
2.定義xml
在 Controller 內使用事件之後,其他的模組如果也想要使用的的話,就需要使用 xml 來註冊事件,其實就是跟上一篇幅的 xml 類似,但是 Event Name 的部分,需要更改成我們自己定義的 Event Neme,這樣即可完成。
<?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="controller_action_catalog_product_save_entity_after"> <observer name="sample_controller_before_execute" instance="Vendor\Extension\Observer\SampleControllerBeforeExecute" /> </event> </config>
其中裡面參數參數的部分,這裡再整理一次:
- name – 每一個事件必須要有獨立且唯一的命名
- instance – 必須指定一個 Class 的 namespace,並且繼承 magento 的 interface
- disabled – 開啟或關閉此事件
- shared – 此 instance 是否要與其他事件共用,預設為 false
下次我們會再介紹支撐Magento 2 背後的系統EAV,更多教學,請看Magento 2 教學導覽,別忘追蹤我們的Facebook粉絲專頁,以及訂閱歐斯瑞電子報,每日幫你更新電商知識!
我要留言