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 | Список обработчиков событий через запятую. |
Ссылки
- Статья с видео о создании данного дополнения.