Middlewares

Компонент Middlewares представляет собой эмулятор посредников. Он предназначен в первую очередь для сторонников так называемых файловых элементов. Использование данного дополнения позволит отказаться от стандартных плагинов MODX и перенести разработку в классы. В Middlewares доступны 2 типа объектов - посредники и обработчики событий.

Посредники (middlewares)

Посредники используются для обработки запроса, а также позволяют выполнить определённый функционал перед выводом ответа пользователю. Принцип работы можно посмотреть на картинке:

Посредники бывают глобальными, обрабатывающие каждый запрос, и текущими, которые срабатывают только для указанных ресурсов. Первые указываются в системной настройке middlewares_global_middlewares - нужно указать их через запятую в нужной последовательности. Вторые указываются в специальной TV ресурса под названием middlewares. В качестве имени посредника указывается название файла класса без расширения ".php".

Посредники представляют собой классы, которые размещаются в папке, указанной в системной настройке middlewares_path. Вот пример класса посредника:

// Файл test.php

class TestMiddleware extends Middlewares\Middleware
{
    public function onRequest() {}

    public function beforeResponse() {}

    public function afterResponse() {}
}
// Если имя файла и имя класса не совпадают, то нужно вернуть название класса.
return 'TestMiddleware';

Класс посредника должен наследоваться от абстрактного класса Middlewares\Middleware. В классе доступен объект $this->modx. Метод onRequest() будет вызван на событие OnMODXInit для глобального посредника и на событие OnLoadWebDocument для посредника ресурса.

Метод beforeResponse() посредника вызывается на событие OnWebPagePrerender, метод OnWebPageComplete() - на событие OnWebPageComplete. Последовательность вызова посредников указана на картинке выше.

Важно помнить!

Если имя файла и имя класса не совпадают, то в файле класса необходимо вернуть имя класса через конструкцию return. Иначе посредник не сработает.

В нашем примере файл посредника называется test.php. Поэтому в классе возвращаем имя файла return 'TestMiddleware';, а чтобы подключить его, в системной настройке или TV ресурса нужно указать имя "test".

Вы можете указать в каком контексте посредник должен сработать. Для этого перечислите рабочие контексты в классе посредника:

class mainMiddleware extends Middlewares\Middleware
{
    // Посредник сработает и в контексте web и в админке.
    public $contexts = array('web','mgr');
    ....
}

По-умолчанию для посрединка определён только web контекст. Это можно увидеть в абстрактном классе Middlewares\Middleware.

Внимание!

В контексте mgr у посредника сработают только 2 метода - onRequest() и beforeResponse(), так как в этом контексте нет аналога события OnWebPageComplete(). Метод beforeResponse() срабатывает на событие OnManagerPageAfterRender.

В посреднике вы можете подключить другие посредники:

// 1. Загрузить класс
$class = app('MiddlewareService')->loadMiddlewareClass('myMiddleware');
// 2. Выполнить нужный метод
(new $class($this->modx))->onRequest();

Обработчики событий (listeners)

Обработчики событий предназначены для выполнения заложенного в них функционала при наступлении определённого события. Обработчики событий как и посредники - это классы, которые размещаются в папке, указанной в системной настройке listeners_path. Класс обработчика событий:

// Файл lmanager.php

class ListenerManager extends Middlewares\Listener
{
    public function OnHandleRequest()
    {
        // 
    }
}
// Если имя файла и имя класса не совпадают, то нужно вернуть название класса.
return 'ListenerManager';

Для того, чтобы обработчик сработал на определённое событие, нужно создать одноименный метод. После того, как обработчик создан, его нужно подключить. Для этого в системной настройке middlewares_listeners указать его псевдоним, т.е. имя файла без расширения. Сделать это можно двумя способами: в админке или глобальном посреднике:

config(['middlewares_listeners' => 'myListener']);
// или классический вариант
$this->modx->setOption('middlewares_listeners', 'myListener');

Как и в посредниках вы также можете ограничить область выполнения обработчиков контекстами. Добавьте нужные контексты в свойство класса:

class myListener extends Middlewares\Listener
{
    // Обработчик сработает и в контексте web и в админке.
    public $contexts = array('web','mgr');
    ....
}

Порядок выполнения

Если нужно выполнить обработчик события до других плагинов (изначально они добавляются в конец списка плагинов), нужно в методе для соответствующего события указать аргумент before с дефолтным значением true:

public function OnHandleRequest($before=true) 
{
    //
}
    
public function OnBeforeDocFormSave($properties, $before=true) 
{
    extract($properties);
    if (empty($resource->longtitle)) {
        $this->modx->event->output('Заполните расширенный заголовок!'); // Вывод ошибки в модальном окне
    }
}

Системные параметры

Ключ По-умолчанию Описание
middlewares_path {core_path}middlewares/ Путь к файлам классов посредников.
middlewares_lpath {core_path}listeners/ Путь к файлам классов обработчиков событий.
middlewares_global_middlewares Список глобальный посредников через запятую.
middlewares_listeners Список обработчиков событий через запятую.
  • Статья с видео о создании данного дополнения.
Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.