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.

 

This post was last modified on 20/02/2019 20:20

Share
Підтримай проект
Пригости мене кавою

Buy Me A Coffee ☕😊💕

 

 

Останні пости

Конфуцій

Коли вам здасться, що мета недосяжна, не змінюйте ціль — змінюйте свій план дій Конфуцій…

12/05/2024

Чарльз Дарвін

Виживає не найсильніший і не найрозумніший, а той, хто найкраще пристосовується до змін Чарльз Роберт…

11/05/2024

Що таке тег canvas в HTML5 і для чого він потрібен?

Елемент <canvas> з’явився лише в HTML5 і використовується для динамічного малювання графіки на веб-сторінці з…

10/05/2024

Ден Браун

Можливо все, — неможливе просто потребує більше часу Ден Браун  

09/05/2024

Що включає в себе чистка ноутбука?

Ноутбук — це не тільки зручний і функціональний ґаджет, а й доволі делікатний пристрій, що…

08/05/2024

Аль Пачино

Ніколи нічого нікому не пояснюйте. Все одно кожен зрозуміє так, як йому вигідно Аль Пачино…

07/05/2024