Эмулятор посредников для MODX + Видео
Хочу познакомить вас с моим новым дополнением для MODX Revolution. Называется он Middlewares
, что часто переводят как посредники. Это такие слои или фильтры, которые обрабатывают поступающий запрос перед тем, как его обработает ядро системы. Также они могут обработать полученный ответ перед выводом его пользователю. Я давно порывался его сделать, но как-то всё не получалось - то времени не было, то желания. Но вот погружаясь в изучение Laravel очень впечатлился видео подкастами Джеффри Вэя (Jeffrey Way) из компании Laracasts. И мне самому жутко захотелось попробовать себя в роли подкастера. Вот я и решил сделать этот пакет, так как он не очень сложный. Как раз для первой пробы пера. В итоге получилось 7 видео.
Сразу прошу прощения за мои "бэ" и "мэ". Как оказалось, далеко мне до Юлия Цезаря. Сложновато одновременно думать о коде и комментировать. Хотя может это дело привычки. И ещё голос немного осип. Результат акклиматизации - из 30-ти градусной Анапы в холодную Москву.
Но процесс мне понравился. Надеюсь понравится и вам.
Middlewares
-
1. Вступление. Продолжительность: 6:10
Это первый из серии уроков по созданию компонента для MODX Revolution. Компонент будет называться Middlewares. В этом видео мы выясним, что из себя он будет представлять и для чего он нужен, а также создадим проект из заготовки modExtra.
-
2. Настройка. Продолжительность: 6:55
В этом видео мы сделаем первоначальные настройки MODX, необходимые для разработки, и удалим всё ненужное из макета modExtra.
-
3. Создание плагина. Продолжительность: 17:18
Создаём плагин, в котором будет загружаться менеджер посредников. Плагин будет срабатывать на 4 события: OnMODXInit, OnLoadWebDocument, OnWebPagePrerender и OnWebPageComplete.
-
4. Создание абстрактного класса. Продолжительность: 4:18
Данный класс будет являться родителем для всех конкретных классов посредников. Он определяет каркас будущих посредников.
-
5. Создание класса менеджера посредников. Продолжительность: 24:41
Пришла очередь создать класс менеджера посредников (в видео я называю его сервисом), который будем управлять всем посредниками. Он загружается в плагине и доступен в любом месте приложения.
-
6. Собираем и тестируем пакет. Продолжительность: 29:34
Теперь мы готовы собрать пакет. Завершаем необходимые правки, проверяем ошибки и собираем пакет. А дальше, собранный пакет установим на тестовый сайт и попробуем его в деле.
-
7. Заливаем проект на GitHub. Продолжительность: 5:06
Пакет готов и протестирован. Теперь удалим историю разработки компонента modExtra и выложим наш проект в публичный доступ на GitHub.
-
8. Пространство имен. Продолжительность: 11:17
В этом видео мы добавим пространство имён Middlewares. Это хорошая практика при разработке пакетов.
-
9. Рефакторим класс сервиса. Продолжительность: 13:10
После творческой части разработки необходимо оценить качество кода и сделать необходимые правки. Этим мы и займёмся в этом видео.
-
10. Создаем обработчики событий. Часть 1. Продолжительность: 34:40
В этой части мы создадим функционал обработчиков событий, основанный на классах, который заменит привычные плагины MODX.
-
11. Создаем обработчики событий. Часть 2. Продолжительность: 10:33
В этой видео мы закончим создание функционала обработчиков событий. К сожалению, на текущий момент данный функционал работать не будет из-за бага в ядре MODX.
-
12. Сборка новой версии пакета. Продолжительность: 19:44
В этом заключительном видео мы как обычно пробежимся по коду, выполним небольшой рефакторинг и выпустим новую версию пакета.
-
13. Авторизация доступа к ресурсам. Продолжительность: 7:57
Рассмотрим небольшой пример использования посредников для ограничения доступа к ресурсам. Т.е. запретим доступ к определённым ресурсам незарегистрированным пользователям.
Заключение
Я не всё реализовал, что хотел. В самом первом видео я анонсировал полноценную поддержку файловых плагинов. Для этого я планировал создать классы обработчиков событий (listeners), которые будут срабатывать на указанные в них события. Но для первого раза мне показалось уже многовато. Этот функционал я обязательно добавлю в следующей версии. Но если вам понравились видео, то я могу сделать ещё одно, в котором мы создадим этот функционал. Так что жду ваших отзывов и лайков. :)
P.S. Осталось самое сложное - написать документацию. Самая нелюбимая мной часть разработки. Я ещё не обновил документацию modHelpers после последнего обновления. Никак не настроюсь.
Update 13.09.2017Добавлено ещё 5 видео, в которых реализовано всё что было запланировано изначально. К сожалению баг MODX не позволяет сразу воспользоваться функционалом обработчиков событий. Но разработчики из MODX обещали поправить этот баг в ближайшее время. Как вариант, вы можете сами его поправить. Как это сделать можно посмотреть тут.
Комментарии ()
Вы должны авторизоваться, чтобы оставлять комментарии.
Просто идея какая — в сообществе сотни вопросов как сформировать тот или иной запрос к базе, чтобы достать то что мне нужно? И в качестве ответов пошёл чистый sql или с примесью шаблонизатора.
А вот если бы можно было создать посредника, который может принимать на входе запросы graphQL, то есть по сути чистый json с элементарной иерархией нужных объектов — обрабатывать — и возвращать те же самые привычные объекты pdo или xpdo для дальнейшей работы. Тут увидел на сайте modxclub.ru Коля занялся изучением react+modx и там есть пример подобной реализации — youtu.be/vkoqEesXomY
Ну собственно вопрос к Вам как спецу по modx — реально такое сделать через посредника?
Просто если бы такую штуку внедрить, например в pdoTools, то выборку любых объектов и даже из связанных таблиц будет делать в разы проще, просто передав json строку.
Т.е. самому ваять реализацию этой концепции? Есть же уже готовые и для PHP и для других языков.
Ну можно, конечно, почему нет. Главное желание и много много времени. Посредник пригодится, если вы планируете создать API. А чтобы просто использовать в коде, то посредник вообще не нужен — просто данные получаете не из HTTP-запроса, а сами подсовываете.
А как использовать запрос GraphQL в pdoTools я, честно говоря, не представляю. Он может быть в десятки строк.
Хотел спросить, а можно как то добавить включение посредников на уровне шаблона, ну может при добавлении какого нибудь параметра его активировать, просто сейчас либо глобально все запросы обрабатываются либо индивидуально для ресурса, а хотелось бы ещё и для конкретного раздела, где все ресурсы одного шаблона?
П.С. Jason Coward обещал выпустить версию MODX 2.6.0 в ближайшее время. В ней исправлен баг с обработчиками событий. Это я к тому, что тогда заработает вторая часть пакета.
Наконец-то 2.6.0 вышел и заработали обработчики событий теперь нативно.
Возник вопрос а как быть с приоритетами своих обработчиков, получается, что они будут выполняться всегда в последнюю очередь, верно?
То есть если у меня в админке есть какой-то плагин на тоже событие что и мой обработчик события, то родной плагин всегда будет выполнен первым.
Или есть какая-то возможность повлиять на порядок выполнения?
Уже давно отрефакторил код и добавил приоритеты. Но нет времени протестировать и выпустить новую версию. Основная причина — небольшой спрос на это дополнение. Поэтому выпущу как дойдут руки и будет желание.
Кстати, эта новая версия никак не зависит от версии MODX. Да! Не хотелось признаваться, но я сильно тупанул — можно спокойно обойтись без кривого метода addEventListener. Тем более, что я так и делал в других своих дополнениях. В общем, сильно злюсь на себя. Слабоумие потихоньку наступает
Спасибо.
П.С. Новая версия готова. Осталось записать видео.