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 ☕😊💕

 

 

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

Генрі Форд

Людина має два мотиви поведінки — один справжній та інший, що гарно звучить Генрі Форд…

16/07/2024

Фрідріх Ніцше

Не треба додумувати надто багато. Так ви створюєте проблеми, яких не існувало Фрідріх Ніцше  

11/07/2024

Такий різний інвертор! Вибираємо між кондиціонерами Inverter, Inverter DC та Full DC

Літо в розпалі, а значить якраз час задуматися про покупку кондиціонера. Але як не загубитися…

06/07/2024

Омар Хайям

Справжній друг — це людина, яка в очі викаже тобі все, що про тебе думає,…

30/06/2024

Корисні поради щодо вибору розсувних дверей

Варто знати, що функціональність і дизайн працюють рука об руку, коли ви використовуєте розсувні двері.…

29/06/2024

Геракліт

Єдине, що постійне, — це зміни. Немає нічого постійного окрім змін. Усе плине, усе змінюється.…

23/06/2024