У Magento 2 з’явились плагіни-перехоплювачі (plugins, interceptors), які дозволяють виконати власний код до/після виклику публічного методу класу.

Для створення власного перехоплювача (плагіна), створіть файл di.xml у папці вашого модуля, помістивши у нього код:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="VendorName\ModuleName\Foder\SomeModel">
        <plugin name="mycompany_mymodule_plugin_modulename_foder_somemodel"
                type="MyCompany\MyModule\Plugin\ModuleName\Foder\SomeModelPlugin" sortOrder="10" />
    </type>
</config>

VendorName\ModuleName\Foder\SomeModel - назва класу, до методу (методів) якого задіюватиметья плагін;
mycompany_mymodule_plugin_modulename_foder_somemodel - унікальна назва вашого плагіна, формуйте її із назви класу плагіна;
MyCompany\MyModule\Plugin\ModuleName\Foder\SomeModel - клас плагіна;
sortOrder - задає пріоритет виконання вашого плагіну, серед інших плагінів для цього класу.

Увага! Файл di.xml можна створенити у папці "etc" і в "ect/frontend", "etc/adminhtml" і тп., залежно від зони застосовування.

 

Також у папці модуля створіть файл: Plugin/ModuleName/Folder/SomeModelPlugin.php для класу перехоплювача; MyCompany\MyModule\Plugin\ModuleName\Foder\SomeModelPlugin.
Помістіть у нього код:

<?php

namespace MyCompany\MyModule\Plugin\ModuleName\Folder;

use \VendorName\ModuleName\Foder\SomeModel;

class SomeModelPlugin
{   public function beforeSetName(SomeModel $subject, $name)
    {
        return ['(' . $name . ')'];
    }
  public function afterGetName(SomeModel $subject, $result)
    {
        return '|' . $result . '|';
    }
public function aroundSave(SomeModel $subject, callable $proceed, $arg1, $arg2)     {
if ($arg1 && subject->someTerm()){
         return $proceed($arg1, $arg2);
         }
return null;
}
}

Before плагін використовується для зміни вхідних даних методу setName($name). Він повинен повертати масив, елементами якого є вхідні параметри.
After плагін - змінює результат методу getName().
Around - змінює результат, базуючись на вхідних даних, або повністю відключає виконання стандартного коду методу save($arg1, $arg2).

Надіємося, що ви зрозуміли принцип побудови назви методів, завдяки прикладу вище.

Зауважте, якщо функція $proceed() не виконується, то стандартний код, а також плагіни із нижчим пріорітетом не будуть задіяні. Також вам не обовязково одночасно використовувати before, after та around.

Після завершення написання плагіна, не забудьте перегенерувати залежності ін'єкцій (Dependency injection). Виконайте команду:

php bin/magento setup:di:compile

 

Пам'ятайте, що плагіни не можуть бути застосованими до:

- фінальних методів;
- фінальних класів;
- до класів, які містять хоча б один фінальний публічний метод;
- не публічних методів;
- статичних методів;
- конструктора;
- віртуальних типів;
- об'єктів, які ініціалізуються перед загрузкою плагінів;

Ви також можете відвідати офісійну документацію Magento 2, щоб довідатись більше про плагіни-перехоплювачі.