Коротке ознайомлення з плагінами (перехоплювачами) в Magento 2

Коротке ознайомлення з плагінами (перехоплювачами) в Magento 2



Плагіни – це одна з нових концепцій в 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.

 



Напишіть тут свою думку/питання

Ваша пошта не публікуватиметься. Обов’язкові поля позначені *