Уявіть, що ви готуєте пасту та сідаєте пограти в якусь гру. Ви слухаєте одним вухом, чи не википить «страва». У цьому випадку ви спостерігач. Коли паста починає википати — спрацьовує подія «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