Плагіни – це одна з нових концепцій в Magento 2. Можливо, називати ці функції «плагінами» буде трохи неправильно, оскільки їх можна прийняти за «модулі». Плагінами, наприклад, називаються модулі для WordPress. Більш доречною назвою для них буде «перехоплювачі». Ці функції перехоплюють певні публічні методи і модифікують їх. Таке перехоплення можна викликати до виконання коду, після або навколо виклику цієї функції. Замість того, щоб розширювати клас і перевантажувати деякі методи, ми можемо просто створити клас, написати метод і використовувати його для зміни вихідного методу! Ми також можемо налаштувати порядок, в якому перехоплювачі будуть виконуватися. І це досить зручно, оскільки дозволяє не переписувати в різних модулях основні функції.
Використання перехоплювачів дозволяє зменшити конфлікти між розширеннями, які змінюють поведінку одного і того ж класу або методу. Ваша реалізація класу перехоплювача буде змінювати поведінку функції класу, але не мінятиме сам клас.
Поведінкою перехоплювача управляє параметр конфігурації sortOrder
, який ви повинні вказати при реєстрації перехоплювача. Він визначає, чи буде ваш плагін запущений до того, як інші плагіни перехоплюють той же метод або після них.
Давайте для прикладу напишемо модуль, який змінить редирект користувача після успішного відправлення повідомлення через контактну форму. Без перехоплювача нам довелося б написати перевагу (preference) для класу Magento\Contact\Controller\Index\Post
і створити клас, який розширював би вихідний контролер. За допомогою такого класу ми б змінили метод execute
. Нам би довелося переписати найважливіший метод класу, щоб просто змінити редирект!
Створіть простий модуль для тесту, можете використовувати нашу попередню інструкцію по створенню модуля для Мадженто 2. Оскільки ми хочемо змінити поведінку класу Magento\Contact\Controller\Index\Post
, ми повинні повідомити про це Magento. Це робиться за допомогою файлу di.xml в папці {ШЛЯХ ДО МОДУЛЯ}/etc/frontend/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="Magento\Contact\Controller\Index\Post"> <plugin name="{pluginName}" type="{PluginClassName}" sortOrder="1" /> </type> </config>
Важливо: Рекомендується вказувати повний шлях до вихідного класу при створенні файлу класу перехоплювача.
Тепер створимо наш перехоплювач за адресою {ШЛЯХ ДО МОДУЛЯ}/Plugin/PostPlugin.php
<?php namespace {VENDOR}\{MODULE}\Plugin; class Post { // конструктор з класами, які ми хочемо використовувати в нашому коді public function __construct( Magento\Framework\App\Request\DataPersistorInterface $dataPersistor, Magento\Framework\App\Action\Context $context ) { $this->dataPersistor = $dataPersistor; $this->context = $context; } // ми повинні передати вихідний клас в якості першого параметра кожного перехоплювача // параметр $result є результатом вихідного методу execute і присутній тільки в перехоплювачів ПІСЛЯ public function afterExecute(\Magento\Contact\Controller\Index\Post $subject, $result) { // в оригінальному методі dataPersistor очищається, якщо повідомлення було надіслано // отже ми можемо використовувати його для визначення того, чи можна зробити редирект користувача за іншою адресою, або повертаємо результат оригінального методу if (!$this->dataPersistor->get('contact_us')) { return $this->context->getResultRedirectFactory()->create()->setPath('/'); } return $result; } }
Ось і все, нашому перехоплювачу навіть не потрібно розширювати будь-який інший клас. В результаті вийшов простий і зрозумілий код, який легко писати та підтримувати.
Сподіваємося, що даної короткої статті вам було досить, щоб вловити саму суть перехоплювачів. Для більш детальної інформації рекомендуємо вам почитати офіційну документацію по перехоплювачам в Magento 2.
Сьогоднішній огляд присвячений людям, для яких важливе питання конфіденційності в Інтернеті, та хто цінує свої…
Вперше про бренд Pro Plan почули у 1986 році, коли він став частиною американської компанії…
Страх покарання гірше самого покарання (Покарання — завжди щось конкретне, і воно все ж краще,…
Якщо ви плануєте розмістити веб-сайт в мережі Інтернет, дуже важливо знайти для нього швидкий і…
Навчання за кордоном вже давно асоціюється з якісною освітою, новими можливостями та безліччю перспектив. Але…
Вибір майстра для ремонту та перетяжки меблів – завдання, яке потребує вдумливого підходу. Адже від…