[Magento 2] Events và Observer là gì? Ứng dụng của Events và Observer (Lập trình Magento cơ bản)

Nội dung

Theo bài trước chúng ta đã tìm hiểu về [Magento 2] Dependency Injection là gì? Cách thức hoạt động của Dependency Injection (Lập trình Magento 2). Trong bài viết này mình sẽ giới thiệu về Events và Observer, thuật ngữ này là một phần quan trọng trong kiến trúc của Magento 2. Vậy Events và Observer là gì? Ứng dụng của Events và Observer trong lập trình Magento? chúng ta cùng tìm hiểu về nó nhé!

Events và Observer là gì? Ứng dụng của Events và Observer (Lập trình Magento cơ bản)
Events và Observer là gì? Ứng dụng của Events và Observer (Lập trình Magento cơ bản)

Events và Observer là gì?

Events và Observer là hai khái niệm quan trọng trong Magento 2, được sử dụng để tùy chỉnh và mở rộng tính năng của hệ thống Magento. Và đây cũng là một trong những cách chính để mở rộng chức năng. Được xây dựng trên nền tảng của mô hình Design Pattern Observer cụ thể là Publish–Subscribe Pattern. Khi sử dụng events và observer bạn có thể chạy mã tuỳ chỉnh của mình vào một sự kiện của Magento hoặc một sự kiện tuỳ chỉnh nào đó.

Cấu trúc của Events và Observer

Cụ thể cấu trúc của Events và Observer bao gồm:

1. Events (Sự kiện)

Là những tín hiệu thông báo về các hành động xảy ra trong hệ thống. Các sự kiện này có thể được Magento 2 định nghĩa sẵn hoặc được định nghĩa bởi các module bên ngoài.

Một số sự kiện phổ biến trong Magento 2 bao gồm:

  • controller_action_predispatch
  • controller_action_postdispatch
  • sales_order_place_after
  • catalog_product_save_after

2. Event Manager (Quản lý sự kiện)

Là đối tượng quản lý các sự kiện trong hệ thống và đăng ký các Observer cho các sự kiện đó.

3. Observer (Người quan sát)

Là đối tượng nhận thông báo khi một sự kiện được kích hoạt và thực hiện các hành động cần thiết dựa trên thông tin từ sự kiện đó.

Một Observer phải triển khai interface \Magento\Framework\Event\ObserverInterface và implement phương thức execute(). Khi một sự kiện được kích hoạt, Event Manager sẽ gửi thông tin về sự kiện đó đến tất cả các Observer đã được đăng ký với sự kiện đó. Mỗi Observer sẽ lấy thông tin từ sự kiện và thực hiện các hành động cần thiết trong phương thức execute().

PHP
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Event\Observer;

class CustomObserver implements ObserverInterface
{
    public function execute(Observer $observer)
    {
        // Thực hiện các hành động cần thiết khi sự kiện xảy ra
    }
}

Trong ví dụ này, CustomObserver triển khai interface ObserverInterface và implement phương thức execute(). Phương thức execute() sẽ được gọi khi sự kiện được kích hoạt và truyền vào đối tượng Observer chứa thông tin về sự kiện. Trong phương thức execute(), ta có thể lấy thông tin từ sự kiện và thực hiện các hành động cần thiết.

4. Dispatch (Phát tán)

Là quá trình phát tán sự kiện đến tất cả các Observer đã đăng ký với sự kiện đó.

Khi một sự kiện được kích hoạt, Event Manager sẽ tìm kiếm tất cả các Observer đã đăng ký với sự kiện đó và gửi thông tin về sự kiện đến tất cả các Observer đó. Mỗi Observer sẽ lấy thông tin từ sự kiện và thực hiện các hành động cần thiết trong phương thức execute().

5. Event Object (Đối tượng sự kiện)

Là đối tượng chứa thông tin về sự kiện và được truyền vào cho tất cả các Observer khi sự kiện được kích hoạt.

Đối tượng sự kiện chứa thông tin về sự kiện, bao gồm các thông tin về đối tượng gây ra sự kiện và các thông tin liên quan đến sự kiện đó. Mỗi sự kiện sẽ có một đối tượng sự kiện tương ứng.

PHP
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Event\Observer;

class CustomObserver implements ObserverInterface
{
    public function execute(Observer $observer)
    {
        // Lấy đối tượng sự kiện từ Observer
        $event = $observer->getEvent();

        // Lấy thông tin từ đối tượng sự kiện
        $object = $event->getObject();

        // Thực hiện các hành động cần thiết với thông tin từ đối tượng sự kiện
    }
}

Trong ví dụ này, CustomObserver lấy đối tượng sự kiện từ Observer và lấy thông tin từ đối tượng sự kiện bằng cách sử dụng phương thức getEvent() và các phương thức khác của đối tượng sự kiện. Sau đó, CustomObserver thực hiện các hành động cần thiết dựa trên thông tin từ đối tượng sự kiện.

5. Event Subscriber (Đăng ký sự kiện)

Là đối tượng đăng ký các sự kiện và các Observer với Event Manager.

Về Event Subscriber chúng ta có 2 cách để đăng ký sự kiện:

Cách 1: Sử dụng \Magento\Framework\Event\SubscriberInterface

Event Subscriber là một lớp đối tượng được sử dụng để đăng ký các sự kiện và các Observer với Event Manager. Đối tượng này sẽ triển khai interface \Magento\Framework\Event\SubscriberInterface và implement phương thức getSubscribedEvents(), cho phép bạn đăng ký nhiều sự kiện và các observer tương ứng. Trong đó sẽ đăng ký các sự kiện và các Observer với Event Manager.

XML
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <subscriber name="vendor_module_customer_subscriber" instance="Vendor\Module\Observer\OrderCreateSubscriber" />
</config>
PHP
<?php
namespace Vendor\Module\Observer;
use Magento\Framework\Event\SubscriberInterface;
use Magento\Framework\Event\ObserverInterface;

class OrderCreateSubscriber implements SubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return [
            'sales_order_place_after' => 'handleOrderCreate'
        ];
    }

    public function handleOrderCreate(ObserverInterface $observer)
    {
        // Handle order create event
    }
}

Trong ví dụ này, getSubscribedEvents() trả về một mảng với một phần tử duy nhất, một sự kiện với tên sales_order_place_after và một observer handleOrderCreate để xử lý sự kiện này. Khi sự kiện được phát ra, observer này sẽ được gọi để xử lý sự kiện đó.

Sau đó, bạn có thể đăng ký OrderCreateSubscriber bằng cách sử dụng Magento\Framework\Event\Manager hoặc sử dụng DI (Dependency Injection) để đăng ký trực tiếp trong constructor của một lớp. Khi sự kiện sales_order_place_after được phát ra, observer handleOrderCreate của OrderCreateSubscriber sẽ được gọi để xử lý sự kiện đó.

Cách 2: Khởi tạo sự kiện trong events.xml bằng tag <observer> sử dụng Magento\Framework\Event\ObserverInterface

Đầu tiên, chúng ta sẽ tạo một file events.xml trong thư mục Vendor/Module/etc/adminhtml để đăng ký sự kiện catalog_product_edit_prepare_form.

XML
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="catalog_product_edit_prepare_form">
        <observer name="vendor_module_add_custom_field" instance="Vendor\Module\Observer\Catalog\Product\EditPrepareFormObserver" />
    </event>
</config>

Ở đây, chúng ta đăng ký sự kiện catalog_product_edit_prepare_form và định nghĩa một observer với tên vendor_module_add_custom_field và instance của class Vendor\Module\Observer\Catalog\Product\EditPrepareFormObserver. Tiếp theo, chúng ta sẽ tạo class EditPrepareFormObserver.

PHP
<?php
namespace Vendor\Module\Observer\Catalog\Product;

use Magento\Framework\Event\ObserverInterface;

class EditPrepareFormObserver implements ObserverInterface
{
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $form = $observer->getForm();
        $fieldset = $form->getElement('base_fieldset');
        $fieldset->addField(
            'custom_field',
            'text',
            [
                'name' => 'custom_field',
                'label' => __('Custom Field'),
                'title' => __('Custom Field'),
                'note' => __('This is a custom field.'),
            ]
        );
    }
}

Ở đây, chúng ta định nghĩa class EditPrepareFormObserver với interface ObserverInterface. Trong phương thức execute(), chúng ta lấy đối tượng form từ sự kiện được truyền vào bằng cách sử dụng $observer->getForm(). Sau đó, chúng ta lấy phần tử base_fieldset trong form và thêm một trường tùy chỉnh vào đó bằng phương thức addField().

Khi trang quản trị sản phẩm được tải, sự kiện catalog_product_edit_prepare_form được kích hoạt và observer EditPrepareFormObserver được thực thi. Trường tùy chỉnh sẽ được thêm vào form với các thuộc tính được định nghĩa trong phương thức addField().

Cách thức hoạt động của Events và Observer

  1. Khi một sự kiện xảy ra trong Magento, một đối tượng sự kiện (Event Object) được tạo ra. Đối tượng này chứa các thông tin về sự kiện, bao gồm cả đối tượng (Object) mà sự kiện đó liên quan đến.
  2. Magento sẽ kiểm tra xem có bất kỳ Subscriber nào đã đăng ký sự kiện đó chưa. Nếu có, sẽ gọi tất cả Subscriber đó.
  3. Mỗi Subscriber sẽ kiểm tra xem sự kiện có phù hợp với nó hay không bằng cách kiểm tra tên sự kiện và đối tượng (Object) liên quan. Nếu phù hợp, Subscriber sẽ thực hiện hành động của nó.
  4. Sau khi tất cả Subscriber đã hoàn thành hành động của chính nó, sẽ tiếp tục thực hiện các hành động khác (nếu có) liên quan đến sự kiện đó.

Ưu nhược điểm của Events và Observer

Ưu điểm:

  • Tính linh hoạt: Sử dụng Events và Observer cho phép các nhà phát triển tùy chỉnh các tính năng của Magento một cách linh hoạt và dễ dàng hơn.
  • Tính mở rộng: Việc sử dụng Events và Observer giúp tách biệt các phần khác nhau của hệ thống và giảm sự phụ thuộc giữa chúng. Điều này làm cho việc thay đổi và cập nhật các tính năng của hệ thống trở nên dễ dàng hơn, mà không ảnh hưởng đến các phần khác trong hệ thống.
  • Tính ổn định: Events và Observer giúp các nhà phát triển có thể tách biệt các phần khác nhau của hệ thống và giảm sự phụ thuộc giữa chúng. Điều này giúp tăng tính ổn định của hệ thống và giảm nguy cơ gây ra lỗi.

Nhược điểm:

  • Khả năng hiểu và sử dụng: Events và Observer yêu cầu một kiến thức chuyên sâu về Magento 2 để hiểu và sử dụng chúng một cách hiệu quả. Điều này có thể gây khó khăn cho các nhà phát triển mới bắt đầu làm việc với Magento 2.
  • Hiệu suất: Việc sử dụng quá nhiều Events và Observer có thể ảnh hưởng đến hiệu suất của hệ thống. Nếu sử dụng chúng không đúng cách, nó có thể làm chậm hệ thống hoặc gây ra các vấn đề về bộ nhớ.
  • Sự phụ thuộc: Sử dụng quá nhiều Events và Observer có thể làm cho các phần khác nhau của hệ thống phụ thuộc quá nhiều vào nhau, gây khó khăn trong việc bảo trì và cập nhật. Khi sử dụng quá nhiều Observer trong một sự kiện thì sẽ dẫn tới vấn đề mất kiểm soát những Observer đó và làm nhiễu loạn hệ thống.

Kết bài

Tóm lại, Events và Observer là một công cụ không thể thiếu trong qua trình làm việc với Magento 2, cũng là một phần quan trọng trong cách Magento hoạt động và cung cấp các tính năng tùy chỉnh và mở rộng cho các nhà phát triển. Tuy nhiên cũng có những hạn chế khi khi lạm dụng quá mức. Vì vậy các bạn cần tìm hiểu kỹ về nó và sử dụng kết hợp với nhau để không ảnh hưởng tới hiệu suất.

Ngoài ra các bạn có thể kiểm tra document của Magento để học hỏi thêm nhé: https://devdocs.magento.com/guides/v2.3/extension-dev-guide/events-and-observers.html

Cảm ơn các bạn đã dành thời gian đọc bài viết này. Nếu có thắc mắc hay cần giải đáp vấn đề gì vui lòng comment phía dưới bài viết nhé! Mình sẽ giải đáp cho các bạn. Thân ái!

Bài viết liên quan

SQL trong Data Analysis: Procedure và Function – 2 công cụ không thể thiếu

Xin chào các bạn đã quay trở lại chuỗi bài SQL trong Data Analysis...

Tự học Data Analyst: Tổng hợp chuỗi bài SQL 101 trong Data Analysis

Trong bài viết này, chúng ta sẽ tổng hợp các bài viết thành một...

SQL trong Data Analysis: Hiểu rõ và ứng dụng đệ quy (Recursive trong PostgreSQL)

Trong thế giới của cơ sở dữ liệu quan hệ, các truy vấn đệ...

[Phân Tích Dữ Liệu Với Python] Tập 1: Làm Quen Với Pandas

Trong thời đại tiến bộ của khoa học dữ liệu, khả năng phân tích...
spot_img