Уявіть, що ви поставили варити макарони і сіли грати Dota 2, чи будь-яку іншу гру, а одним вухом слухаєте чи не збігає "страва" - у такому випадку ви - слухач. Коли макарони починають збігати - викликається подія "макарони_почали_збігати", яка заставляє вас (слухача) підірватись з місця і помчати на кухню (виконати дію, алгоритм).
У Magento 2, як і в реальному житті, теж існують слухачі та події, які реалізовані на основі шаблону "Публікація-підписка" (Publish–subscribe pattern). Ми вже описували плагіни (plugins) у Magento 2, які дозволяють розширювати та змінювати функціонал магазину. Розглянемо, як це можна зробити за допомогою подій та слухачів.
Події (Events)
Події викликаються модулями Magento 2, коли та чи інша дія відбулася, або повинна відбутись. Мадженто має багато власних подій, а також дозволяє викликати власні.
Для виклику події використовуйте метод dispatch класу \Magento\Framework\Event\ Manager. Наприклад:
namespace MyCompany\MyModule;
class MyClass{
/**
* @var EventManager
*/
private $eventManager;
public function __construct(
// деякі інші залежності
\Magento\Framework\Event\Manager $eventManager
) {
//деякий код
$this->eventManager = $eventManager;
}
public function something()
{
$eventData = null;
/* викликаємо подію 1 */
$this->eventManager->dispatch('my_module_event_before');
// деякий код
/* викликаємо подію 2 */
$this->eventManager->dispatch('my_module_event_after', ['myEventData'=>$eventData]);
}
}
У наведеному прикладі ми викликали 2-і події: "my_module_event_before" та "my_module_event_after". За такими назвами до подій можна приєднувати слухачів.
Другим параметром у методі dispatch можна передавати масив з даними, які будуть доступні слухачу під час виконання своїх дій.
Слухачі (Observers)
Слухачами у Magento 2 є класи певного типу, які імплементують Magento\Framework\Event\ObserverInterface інтерфейс. Код слухачів виконується в результаті виклику події.
Для створення, наприклад, observer на подію додавання продукту до корзини, яка викликається у класі Magento\Checkout\Model\Cart
$this->_eventManager->dispatch(
'checkout_cart_product_add_after',
['quote_item' => $result, 'product' => $product]
);
1. Створіть файл слухача у папці власного модуля:
Observer/СheckoutСartProductAddAfter.php
із кодом:
<?php
namespace MyCompany\MyModule\Model;
use Magento\Framework\Event\ObserverInterface;
class СheckoutСartProductAddAfter implements ObserverInterface
{
public function __construct()
{
//Оголошення залежностей
}
public function execute(\Magento\Framework\Event\Observer $observer)
{
/* Отримуємо дані слухача за допомогою "гетерів" */
$product = $observer->getProduct();
$item = $observer->getQuoteItem();
/* Альтернативна версія "гетера"
$product = $observer->getData('product');
$item = $observer->getData('quote_item');
*/
//Код, який потрібно виконати при події
}
}
Назва класу (у прикладі СheckoutСartProductAddAfter) може бути довільною, з дотриманням вимог найменувань класів у PHP, так код-стилю Magento 2. Назвіть клас так, щоб його назва одразу вказувала на подію, при якій він застосовується.
execute - обов'язкова назва методу, яка вимагається згідно інтервейсу.
2. Підключіть observer до події.
Для цього створіть файл у папці власного модуля:
etc/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="checkout_cart_product_add_after">
<observer name="mymoduile_checkout_cart_product_add_after" instance="MyCompany\MyModule\Model\СheckoutСartProductAddAfter" />
</event>
</config>
Створювати цей файл можна із шляхом etc/frontend/events.xml чи etc/adminhtml/events.xml залежно від зони застосування. XML конфігурації створені безпосередньо в папці etc застосовуються, як на вітрині магазину (frontend), так і в адмін-панелі (adminhtml).
3. Очистіть кеш.
Виконайте CLI команду:
php bin/magento cache:clean
Список усіх подій Magento 2
Список стандартних подій Magento 2 доволі великий, тому ми не приводитимемо його у цій публікації. Ви можете знайти його за допомогою Google.