• Блог
  • Эмулятор посредников для 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 обещали поправить этот баг в ближайшее время. Как вариант, вы можете сами его поправить. Как это сделать можно посмотреть тут.

    09 сентября 2017, 16:52   2702     20

    Комментарии ()

    1. Vladimir 09 сентября 2017, 23:21 # +1
      Спасибо!
      1. Сергей Шлоков 10 сентября 2017, 07:43 # 0
        Рад что понравилось.
      2. Семён 10 сентября 2017, 10:14 # +1
        Сергей, круто получилось. Конечно, ждём и просим ещё видосы и по оставшемуся функционалу, ну так что бы компонент был полностью от начала до конца сделан и много много других, подача материала хорошая, что довольно редко встречается среди разработчиков) Продолжайте в том же духе!
        1. Сергей Шлоков 10 сентября 2017, 10:27 # 0
          Спасибо. Следите за новостями. Вот только не знаю, как эти новости сообщать. Ну в общем, пока просто заходите сюда. А в дальнейшем, наверно, твиттер для этого прикручу или тут раздел новостей добавлю. Подумаю.
          1. Семён 10 сентября 2017, 10:47 # 0
            Если речь идёт о видео новостях и Вы решили попробовать себя в видеоподкастинге может есть смысл сделать себе канал на ютубе, ну понятно, что он уже есть, я имею ввиду оформить его так же в стиле modzone (чёрно-бело-красное) и под каждым видосом давать ссылки на сайт, думаю при таком раскладе и канал и сайт получат много новых подписчиков и кучу трафика.
            1. Сергей Шлоков 10 сентября 2017, 11:19 # 0
              Да, спасибо, займусь в ближайшее время. Но всё равно, одно дело подписка в ютубе, другое тут через rss.
        2. Семён 11 сентября 2017, 15:57 # 0
          Сергей тут возник вопрос, а можно ли с помощью этих посредников подменить стандартную систему запросов к базе данных на graphQL?
          Просто идея какая — в сообществе сотни вопросов как сформировать тот или иной запрос к базе, чтобы достать то что мне нужно? И в качестве ответов пошёл чистый sql или с примесью шаблонизатора.
          А вот если бы можно было создать посредника, который может принимать на входе запросы graphQL, то есть по сути чистый json с элементарной иерархией нужных объектов — обрабатывать — и возвращать те же самые привычные объекты pdo или xpdo для дальнейшей работы. Тут увидел на сайте modxclub.ru Коля занялся изучением react+modx и там есть пример подобной реализации — youtu.be/vkoqEesXomY
          Ну собственно вопрос к Вам как спецу по modx — реально такое сделать через посредника?
          Просто если бы такую штуку внедрить, например в pdoTools, то выборку любых объектов и даже из связанных таблиц будет делать в разы проще, просто передав json строку.
          1. Сергей Шлоков 11 сентября 2017, 17:01 # 0
            Я, честно говоря, не знаком с этой спецификацией. Только что бегло посмотрел. В связи с чем у меня возникает вопрос — как писать резолверы, если не умеешь писать запросы и не знаешь mySql. Ну допустим, найдётся добрый человек и напишет их для ядра MODX. А что делать с различными дополнениями? Кто для них будет писать резолверы.

            А вот если бы можно было создать посредника, который может принимать на входе запросы graphQL, то есть по сути чистый json с элементарной иерархией нужных объектов — обрабатывать — и возвращать те же самые привычные объекты pdo или xpdo для дальнейшей работы.
            Т.е. самому ваять реализацию этой концепции? Есть же уже готовые и для PHP и для других языков.

            Ну собственно вопрос к Вам как спецу по modx — реально такое сделать через посредника?
            Ну можно, конечно, почему нет. Главное желание и много много времени. Посредник пригодится, если вы планируете создать API. А чтобы просто использовать в коде, то посредник вообще не нужен — просто данные получаете не из HTTP-запроса, а сами подсовываете.
            А как использовать запрос GraphQL в pdoTools я, честно говоря, не представляю. Он может быть в десятки строк.
          2. Семён 01 ноября 2017, 16:29 # 0
            Сергей, спасибо, ещё раз за компонент, теперь он постоянный товарищ в моей разработке сайтов.
            Хотел спросить, а можно как то добавить включение посредников на уровне шаблона, ну может при добавлении какого нибудь параметра его активировать, просто сейчас либо глобально все запросы обрабатываются либо индивидуально для ресурса, а хотелось бы ещё и для конкретного раздела, где все ресурсы одного шаблона?
            1. Сергей Шлоков 01 ноября 2017, 17:38 # 0
              Создаёте ТВшку с дефолтным значением и указываете для каких шаблонов. Соответственно все ресурсы этого шаблона будут запускать указанного посредника.
              1. Семён 01 ноября 2017, 17:48 # 0
                Да, такой вариант сейчас и использую, я просто подумал, что реакция посредников при обращение к допполям дольше, чем при включении ещё на уровне шаблона. Может это и не критично.
                1. Сергей Шлоков 01 ноября 2017, 18:57 # 0
                  Не критично. Тем более, что вклиниться на уровне шаблона возможности нет.

                  П.С. Jason Coward обещал выпустить версию MODX 2.6.0 в ближайшее время. В ней исправлен баг с обработчиками событий. Это я к тому, что тогда заработает вторая часть пакета.
                  1. Семён 01 ноября 2017, 19:33 # 0
                    Странно, помню когда-то пользовался пакетом от Николая Ланца — modxSite там был шаблонизатор smarty, он читал установленный параметр у шаблона типа tpl=«homepage.tpl» и включался в работу, я почему-то подумал, что это возможно сделать и с посредниками, ну да Бог с ним. А на счёт обработчика событий уже пользуюсь Вашей заплаткой, но всё равно жду обновления.
                    1. Сергей Шлоков 01 ноября 2017, 19:41 # +1
                      Судя по описанию, то же что и у меня. Ресурс подгружается на событие OnLoadWebDocument. И только в этот момент можно определить шаблон, ТВ и всё остальное. Глобальный посредник срабатывает на событие OnHandleRequest и на этом этапе ещё неизвестен ресурс, а значит и шаблон получить нельзя.
            2. Семён 17 ноября 2017, 10:52 # 0
              Сергей, приветствую.
              Наконец-то 2.6.0 вышел и заработали обработчики событий теперь нативно.
              Возник вопрос а как быть с приоритетами своих обработчиков, получается, что они будут выполняться всегда в последнюю очередь, верно?
              То есть если у меня в админке есть какой-то плагин на тоже событие что и мой обработчик события, то родной плагин всегда будет выполнен первым.
              Или есть какая-то возможность повлиять на порядок выполнения?
              1. Сергей Шлоков 17 ноября 2017, 15:36 # 0
                Привет!
                Уже давно отрефакторил код и добавил приоритеты. Но нет времени протестировать и выпустить новую версию. Основная причина — небольшой спрос на это дополнение. Поэтому выпущу как дойдут руки и будет желание.

                Кстати, эта новая версия никак не зависит от версии MODX. Да! Не хотелось признаваться, но я сильно тупанул — можно спокойно обойтись без кривого метода addEventListener. Тем более, что я так и делал в других своих дополнениях. В общем, сильно злюсь на себя. Слабоумие потихоньку наступает :(
                1. Семён 17 ноября 2017, 15:48 # 0
                  На счёт основной причины — может рублём поддержать? Только я не видел тут ссылки на сайте для донатов. Мне нравятся компоненты, которые Вы делаете, поэтому я с удовольствием поддержу Ваш труд.
                  1. Сергей Шлоков 17 ноября 2017, 19:04 # 0
                    Кто ищет… Но приму если только в качестве благодарности. В принципе, мне и простого «Спасибо» достаточно. Доброе слово и собаке приятно :)

                    Мне нравятся компоненты, которые Вы делаете,
                    Спасибо.
                    1. Семён 20 ноября 2017, 12:31 # +1
                      Отправил Вам «Спасибку» за Ваши труды
                      1. Сергей Шлоков 20 ноября 2017, 19:06 # 0
                        Долетела, спасибо.

                        П.С. Новая версия готова. Осталось записать видео.

              Вы должны авторизоваться, чтобы оставлять комментарии.

              Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.