У Magento 2 ви можете створювати плагіни (перехоплювачі), які дозволяють розширювати функціональність та виконувати власний код до, після або навколо будь-якого публічного методу PHP-класу.
Наприклад, є PHP-клас із публічними функціями "setName", "getName", "save":
<?php
namespace VendorName\ModuleName\Folder;
class SomeModel
{
private $name;
public function setName($name, $storeId = 0) {
$this->name[0] = $name;
}
public function getName($storeId = 0) {
return $this->name[$storeId];
}
public function save($fields, $customData) {
/* some save logic here */
}
}
Як створити плагін у Magento 2?
1. Створіть файл etc/di.xml у папці Basic модуль та додайте туди наступний код:
<?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\Folder\SomeModel">
<plugin name="mycompany_mymodule_plugin_modulename_Folder_somemodel"
type="MyCompany\MyModule\Plugin\ModuleName\Folder\SomeModelPlugin" sortOrder="10" />
</type>
</config>
VendorName\ModuleName\Folder\SomeModel - назва класу, з методом якого буде пов'язаний плагін;
mycompany_mymodule_plugin_modulename_Folder_somemodel - унікальна назва плагіна, наприклад, утворена з назви класу плагіна;
MyCompany\MyModule\Plugin\ModuleName\Folder\SomeModel - клас плагіна;
sortOrder - встановлює пріоритет виконання плагіна, серед інших плагінів цього класу.
Увага! Файл di.xml можна створити в папці "etc" та в "ect/frontend", "etc/adminhtml" тощо, залежно від області застосування.
2. Також створіть Plugin/ModuleName/Folder/SomeModelPlugin.php файл для класу перехоплювача MyCompany\MyModule\Plugin\ModuleName\Folder\SomeModelPlugin у папці модуля.
3. Додайте наступний код:
<?php
namespace MyCompany\MyModule\Plugin\ModuleName\Folder;
use \VendorName\ModuleName\Folder\SomeModel;
class SomeModelPlugin
{
/* Magento 2 before plugin example */ public function beforeSetName(SomeModel $subject, $name, $storeId = 0)
{
return ['(' . $name . ')'];
}
/* Magento 2 after plugin example */ public function afterGetName(SomeModel $subject, $result, $name, $storeId = 0)
{
return '|' . $result . '|';
}
/* Magento 2 around plugin example */ public function aroundSave(SomeModel $subject, callable $proceed, $fields, $customData) {
if ($someCondition){
return $proceed($fields, $customData);
}
return null;
}
}
Magento 2 Before Plugin
Before plugin використовується для зміни вхідних даних оригінальної функції ( setName ).
Назва функції складається зі слова " before " Plus оригінальна назва функції з великої першої літери, наприклад: before + S etName = beforeSetName .
Перший вхідний аргумент - $subject - оригінальний об'єкт класу, далі вхідні параметри оригінальної функції.
Функція плагіна повертає масив змінених вхідних параметрів (аргументів). Порядок результуючих елементів у масиві повинен відповідати порядку вхідних аргументів. Якщо ви не хочете змінювати аргументи та просто виконуєте код перед... виконання оригінальної функції, тоді функція плагіна повинна повертати значення null .
Magento 2 After Plugin
After plugin використовується для зміни результату оригінальної функції або дозволяє запускати код після виконання оригінальної функції ( getName ) .
Назва функції складається зі слова " after " Plus оригінальна назва функції з великої першої літери, наприклад: after + G etName = afterGetName .
Перший вхідний аргумент - $subject - оригінальний об'єкт класу, другий - $result - результат виконання оригінальної функції або плагінів раніше через пріоритет сортування, далі вхідні параметри оригінальної функції.
Функція плагіна повертає новий результат.
Важливо!
Якщо ви не хочете змінювати результат і просто хочете виконати якийсь код після виконання оригінальної функції ви НЕ МОЖЕТЕ повертати значення null , як це було з плагіном "before", оскільки повернення null активно змінює результат на NULL. Не пропустіть це.
Плагін Magento 2 Around
Плагін Around - змінює результат оригінальної функції на основі вхідних даних або вимикає виконання оригінальної функції ( save ).
Це небезпечний плагін.
Magento рекомендує уникати використання плагінів around, коли вони не потрібні, оскільки їх використання може запобігти виконанню оригінальної функції або інших плагінів у черзі, а також збільшити трасування стека та вплинути на продуктивність.
Плагіни Around були корисними до випуску Magento 2.2, оскільки раніше плагіни "after" цієї версії не могли отримувати вхідні аргументи функції. Плагін Around в основному використовувалася для зміни результату на основі вхідних аргументів.
Назва функції складається зі світу " around " Plus оригінальна назва функції з великої першої літери, наприклад: around + S ave = aroundSave .
Перший вхідний аргумент - $subject - оригінальний об'єкт класу, другий - $proceed - викликувана змінна, яка дозволяє виконувати оригінальну функцію та інші плагіни в черзі, далі вхідні параметри оригінальної функції.
Функція around повертає новий результат.
Важливо!
Якщо функція $proceed() не виконується, то стандартний код, а також плагіни з нижчим пріоритетом, не будуть увімкнені.
Компіляція ін'єкцій залежностей
Після створення нового плагіна не забудьте перегенерувати ін'єкцію залежностей, щоб вона запрацювала. Виконайте цю команду CLI:
php bin/magento setup:di:compile
Пам'ятайте, що плагіни Magento 2 не можна застосовувати до:
- кінцеві методи;
- кінцеві класи;
- непублічні методи;
- статичні методи;
- конструктор;
- віртуальні типи ;
- об'єкти, що ініціалізуються перед завантаженням плагінів;
Якщо ви хочете дізнатися більше про порядок сортування плагінів, прочитайте інструкцію пріоритезувати їх .