Categories: Мадженто 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.

 

Share
Published by
SebWeo

Recent Posts

Чи можлива анонімність, конфіденційність чи приватність в Інтернеті?

Сьогоднішній огляд присвячений людям, для яких важливе питання конфіденційності в Інтернеті, та хто цінує свої…

1 день ago

Як з’явився Pro Plan: шлях від ідеї до світового успіху

Вперше про бренд Pro Plan почули у 1986 році, коли він став частиною американської компанії…

4 дні ago

Стефан Цвейг

Страх покарання гірше самого покарання (Покарання — завжди щось конкретне, і воно все ж краще,…

5 днів ago

Чи можна знайти доступний хостинг у 2024 році?

Якщо ви плануєте розмістити веб-сайт в мережі Інтернет, дуже важливо знайти для нього швидкий і…

2 тижні ago

Чому обрати освіту за кордоном: переваги для майбутнього вашої дитини

Навчання за кордоном вже давно асоціюється з якісною освітою, новими можливостями та безліччю перспектив. Але…

2 тижні ago

Як вибрати майстра для перетяжки меблів?

Вибір майстра для ремонту та перетяжки меблів – завдання, яке потребує вдумливого підходу. Адже від…

2 тижні ago