/
Event (4h)

Event (4h)

https://devdocs.magento.com/guides/v2.4/extension-dev-guide/events-and-observers.html

https://docs.google.com/presentation/d/1QCex-jQxiqnGxqYcRf1WCGCcuGR-een7/edit?usp=sharing&ouid=112566144493030284998&rtpof=true&sd=true

 

1, Lý thuyết

Để mở rộng chức năng hoặc thay đổi logic của source code, Magento cung cấp cho chúng ta một phương pháp chính, đó là sử dụng Event và Observer. Event và Observer trong Magento 2 dựa theo một design pattern trong lập trình, đó là Publish–subscribe pattern. Về nguyên tắc hoạt động, khi chúng ta tương tác với Magento, sẽ phát ra một số sự kiện gọi là event. Module của chúng ta sẽ khai báo và sử dụng Observer để bắt và xử lý event đó. Do đó, bạn có thể viết đoạn mã tùy chỉnh để ứng với một sự kiện của Magento phát ra. Ngoài ra, bạn cũng có thể thêm một event trong source code của mình.

Event

Event được phát ra khi một hành động cụ thể nào đó trong Magento được kích hoạt. Ví dụ như khách hàng login, sẽ phát ra các sự kiện là customer_login … Khi một sự kiện được phát ra, bạn có thể truyền data cho sự kiện đó và các observer có thể bắt được và xử lý data đó.

Phát sự kiện (Dispatching events) : Sự kiện trong Magento được phát ra (dispatch) bằng cách sử dụng class Magento\Framework\Event\Manager. Bạn cũng có thể gửi đi data mà bạn muốn cung cấp cho các observer ở trong hàm phát sự kiện.

Sau đây là ví dụ khi bạn muốn phát ra một event tùy chỉnh:

<?php namespace MyCompany\MyModule; use Magento\Framework\Event\ObserverInterface; class MyClass{ /** * @var EventManager */ private $eventManager; public function __construct(\Magento\Framework\Event\Manager $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]); } }

Các area của event:

Về cơ bản, vị trí của các file khai báo quan sát event sẽ nằm trong thư mục /etc và tên là events.xml.

  • etc/events.xml : phạm vi global

  • etc/frontend/events.xml : chỉ ở ngoài frontend

  • etc/adminhtml/events.xml : chỉ ở trong backend

Observer và subscribe event

Observer là thành phần dùng để bắt event và xử lý chúng. Ở đây chúng ta sẽ viết code để thay đổi logic xử lí.

Để quan sát một events, chúng ta sẽ viết trong file events.xml:

File đó gồm những thuộc tính sau:

  • Name (bắt buộc) – Tên của observer

  • instance (bắt buộc) – tên đầy đủ của class observer

  • disabled – Xác định xem observer này có được kích hoạt hay không. Mặc định sẽ là false.

  • shared – Có shared hay không, mặc định là false.

Ví dụ:

<?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>

Để tạo một observer, bạn sẽ tạo một class ở thư mục /Observer. Class đó sẽ implements interface Magento\Framework\Event\ObserverInterface:

<?php 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... } }

Thực tế sử dụng trong Magento:

Để cho các bạn hiểu rõ hơn cơ chế sử dụng Event – Observer, mình sẽ lấy ví dụ thực tế trong code của Magento về việc Magento xử lý việc log các sự kiện đăng nhập của khách hàng.

Trong class Magento\Customer\Model\Session, Magento dispatch một event:

ở đây, trong code xử lý để login customer, Magento đã phát ra một event và đi kèm theo đó là object customer. Để ghi lại log về lịch sử login, Magento đã bắt event này trong file: module-customer/etc/frontend/events.xml. Chúng ta có thể hiểu phạm vi sử dụng là trong frontend:

Và khai báo class xử lý là Magento\Customer\Observer\LogLastLoginAtObserver. Sau đây là nội dung trong hàm execute():

ở đây Magento đã lấy id của customer qua object customer (được lấy bằng $observer->getEvent()->getCustomer()). Sau đó xử lý là gọi hàm log trong logger.

Use event:

  • After placing order, logout customer if the customer is logined

  • When add product to cart, discount 50%

Related content

Service Contract/WebApi (1.5d)
Service Contract/WebApi (1.5d)
More like this
Another Technique (2d)
Another Technique (2d)
Read with this
Event Observer (4h)
Event Observer (4h)
More like this
Model/Resource Model/Collection (1 day)
Model/Resource Model/Collection (1 day)
Read with this
Redux - Introduction (3h)
Redux - Introduction (3h)
More like this
Admin Customize: Menu/System/ Grid/Form/UiComponent (2d)
Admin Customize: Menu/System/ Grid/Form/UiComponent (2d)
Read with this