Уявіть, що ви готуєте пасту та сідаєте пограти в якусь гру. Ви слухаєте одним вухом, чи не википить «страва». У цьому випадку ви спостерігач. Коли паста починає википати — спрацьовує подія «pasta_began_to_boil_away», яка змушує вас (спостерігача) поспішити на кухню (виконати дію, алгоритм).
У Magento 2, як і в реальному житті, є спостерігачі та події, які реалізовані на основі шаблону « Публікація-підписка ». Ми вже описали плагіни в Magento 2 , що дозволяє розширювати та змінювати функціональність магазину. Давайте подивимося, як це можна зробити за допомогою подій та спостерігачів у Magento 2.
Події
Події запускаються модулями Magento 2, коли дія відбулася або має відбутися. Magento має багато власних подій, а також дозволяє викликати власну подію.
Використовуйте метод dispatch класу \Magento\Framework\Event\ Manager для виклику події.
Наприклад:
namespace MyCompany\MyModule;
class MyClass{
/**
* @var EventManager
*/
private $eventManager;
public function __construct(
// some other dependancies
\Magento\Framework\Event\Manager $eventManager
) {
//some code
$this->eventManager = $eventManager;
}
public function something()
{
$eventData = null;
/* calling event 1 */
$this->eventManager->dispatch('my_module_event_before');
// some code
/* calling event 2 */
$this->eventManager->dispatch('my_module_event_after', ['myEventData'=>$eventData]);
}
}
У цьому прикладі ми викликали 2 події: "my_module_event_before" та "my_module_event_after" . Спостерігачі повинні приєднуватися до подій за такими іменами.
Другий параметр у методі dispatch допомагає передавати масив даних, який буде доступний спостерігачеві під час його дій.
Спостерігачі
Спостерігачі в Magento 2 – це певні типи класів, що реалізують інтерфейс Magento\Framework\Event\ObserverInterface . Код спостерігача виконується в результаті виклику події.
Наприклад, щоб створити спостерігача для події додавання товару до кошика, яка викликається в класі 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()
{
//Declaration of dependencies
}
public function execute(\Magento\Framework\Event\Observer $observer)
{
/* We obtain oberver data using "getters" */
$product = $observer->getProduct();
$item = $observer->getQuoteItem();
/* Альтернативна версія "гетера"
$product = $observer->getData('product');
$item = $observer->getData('quote_item');
*/
//The code to execute at the event
}
}
Назва класу (у прикладі CheckoutCartProductAddAfter ) може бути різною, але з необхідними вимогами до назв класів PHP та коду в стилі Magento 2. Назвіть клас так, щоб його назва одразу вказувала на подію, в якій він використовується.
execute – обов’язкова назва методу, необхідного інтерфейсом.
2. Підключіть спостерігача до події.
Створіть наступний файл у папці вашого модуля:
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