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粉絲專頁,以及訂閱歐斯瑞電子報,每日幫你更新電商知識!
我要留言