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.

 

View Comments

  • ничерта не понятно
    {ПУТЬ К МОДУЛЮ}/Plugin/PostPlugin.php
    {ПУТЬ К МОДУЛЮ} - это где? можно поконкретнее?

    • Ну это либо app/code/{МОДУЛЬ} либо vendor/magento/{МОДУЛЬ}

Share
Published by
SebWeo
Tags: Magento2

Recent Posts

Что делать начинающему программисту на старте карьеры?

После завершения начального курса по программированию вы, как начинающий программист, имеете несколько путей для дальнейшего…

1 день ago

Что поможет сделать ваш сайт более веб-доступным?

Основная цель создания сайта – это поделиться своим контентом со всем миром. Вы хотите, чтобы…

4 дня ago

Фитолампа для зелени на балконе: Ваш секрет для здорового урожая круглый год

Фитолампа для выращивания зелени на балконе: Оптимальные условия для урожая Фитолампа для выращивания зелени на…

5 дней ago

Ключевые моменты собеседования с клиентом по разработке/дизайну сайта

Собеседование – это ценное умение, которое может помочь узнать больше о человеке, какой-либо теме или…

6 дней ago

Печать книги Львов: как быстро и выгодно напечатать книгу от 1 экземпляра

В мире, где индивидуальность имеет значение, возможность напечатать книгу во Львове даже в единственном экземпляре…

1 неделя ago

Экстернат 10–11 класс Украина: современное решение для быстрого и удобного обучения

Сегодня все больше учеников и родителей ищут альтернативу традиционной школе, выбирая более гибкие, индивидуальные и…

2 недели ago