Здравствуйте, хабрапользователи!
В этой публикации мы расскажем о нашей новой нароботке Events class.
Новый класс реализовывает некую систему событий для ImageCMS. Это механизм, который предоставляет возможность разработчику реагировать на возникновение определенных ситуаций в системе, что станет неотъемлемой составляющей для написания более гибких модулей.
Дальше расскажем подробно о том, как мы видим инженерию и вектор будущих развитий.
Участники
Начнем с описания общих понятий, которые мы для себя определили; они также будут встречаться в статье дальше. Это:
- Событие — реакция на определенное действие системы (может быть инициировано пользователем);
- Слушатель — отслеживает некоторое событие и регистрирует обработчика;
- Обработчик — метод, который получает управление при срабатывании события.
Как работает
За каждым участником закреплен некий набор возможных действий. Последовательность может быть изменена, но отклонения, в основном, не значительны, поэтому будем рассматривать смоделированные ниже ситуации как плановые.
Слушатели:
- срабатывает автозагрузка стороннего модуля, где может быть зарегистрирован слушатель. Слушатель указывает какое событие он ждет, и какому методу он передаст управление в случае, если событие будет инициировано;
- каждый слушатель помещается в некий общий пулл;
- инициализация закончена.
Система:
- при некоторых операциях, например редактировании/добавлении статьи, ImageCMS генерирует событие;
- система ищет в общем пулле слушателей данного события и устанавливает триггер на исполнение;
- продолжает обрабатывать запрос пользователя;
- после завершения всех операций запускается хук обработки общего пулла (момент выполнения операций слушателями).
Запуск обработчиков:
- Срабатывает
CMSFactoryEvents::runFactory()
— метод, который обходит слушателей с триггером на исполнение (те, которые дождались своего события), и запускает объявленные методы — обработчики; - Методы-обработчики получают управление и входные данные.
Что в середине
Теперь немного по этапам. И так:
1) На первом этапе пользователь натыкается на роутер и попадает на нужный контроллер. Мы упускаем этот момент, так как его суть не столь важна для понимания принципов работы. Нас интересует лишь момент, когда своим поведением пользователь спровоцирует событие. В таком случае мы добавим к общему пулу данные о самом событии и сопровождающие данные. На этом роль пользователя закончена. А теперь, что не увидел пользователь? Случилось на самом деле два действия, стоящих внимания разработчика.
2) Сработали методы autoload
тех модулей, для которых разрешен запуск (включение автозагрузки осуществляется из администраторской панели переключением тумблера). Именно на этот этап мы решили повесить возможность объявления об ожидании того или иного действия от пользователя. Модули добавляют информацию о готовности принять данные на нужный метод в общий пул. Добавление происходит с помощью конструкции
CMSFactoryEvents::create()
->setListener('callback');
здесь "callback
" и есть тем методом, который будет вызван при состоявшемся событии. Но при каком именно? Есть два пути. Либо указать доступным из перечисленного списка методом связывания данных, например:
CMSFactoryEvents::create()
->onAddToCart()
->setListener('callback');
здесь "onAddToCart
" будет указателем на событие “Добавление в корзину товара”. Другой способ подразумевает передачу вторым параметром метода "setListener
" ключа. Ключ состоит из комбинации класса и метода, разделенных двоеточием. Например, чтобы указать тот же “Добавление в корзину товара”, нужно указать ключ "Cart:add
"
CMSFactoryEvents::create()
->setListener('callback', 'Cart:add');
Разобрались. А куда нас это приведет?
3) По завершению работы контроллера отработают хуки CodeIgniter’a. Система инициирует обход слушателей, и запуск тех, которые дождались «своего» события.
События
Полный список, доступный на данный момент, мы выложили на wiki
Вот несколько событий для примера:
onAdminPageUpdate — вызывается при изменении статьи;
onAdminPageCreate — вызывается при создании статьи;
onAdminСategoryCreate — вызывается при создании категории;
onAdminСategoryUpdate — вызывается при изменении категории;
onShopProductUpdate — вызывается при изменении товара;
onAddComment — вызывается, когда пользователь оставил комментарий,
и другие…
Где посмотреть
Модуль «Trash», который добавляет запись о редиректе 301 на категорию, с удаленного продукта. Смотрите
public static function adminAutoload()
https://github.com/imagecms/ImageCMS/blob/development/application/modules/trash/trash.php
Events Class on Github:
https://github.com/imagecms/ImageCMS/blob/development/application/modules/CMSFactory/BaseEvents.php
https://github.com/imagecms/ImageCMS/blob/development/application/modules/CMSFactory/Events.php
В качестве завершения
На данный момент функционал находится на стадии тестирования и доработки. Так же остались нерешенными некоторые вопросы и пути их реализации. Например, триггеры «before/pre» и «after/post» для событий, приоритеты запуска обработчиков и др.
Присоединяйтесь, у нас еще много работы, в том числе по описанию и добавлению событий (GitHub). Оставляя свои комментарии и делясь идеями, вы помогаете развиваться продукту, а также напоминаете себе приятный факт, что являетесь частью ImageCMS OpenSource ;)
P.S. Напомним: ImageCMS Corporate — бесплатная OpenSource система для разработки и управления сайтами, функционал которой решает 95% типичных проблем для корпоративных сайтов.
ImageCMS Shop — система для профессиональной разработки Интернет-магазинов с расширенными возможностями.
Автор: mrKaero