maximaster / bitrix-event-dispatcher
EventDispatcherInterface-совместимый диспетчер для регистрации обработки событий вызываемых через API Битрикс.
v0.1.1
2024-08-28 11:14 UTC
Requires
- php: ^8.2
- marcosh/lamphpda: ^3.0
- maximaster/bitrix-value-objects: ^1.0
- symfony/event-dispatcher: ^7.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.59
- psalm/phar: ^5.25
This package is auto-updated.
Last update: 2024-10-28 11:53:47 UTC
README
Позволяет использовать symfony/event-dispatcher для регистрации обработчиков на события Битрикс, создавая при этом под каждое событие собственный класс.
Зачем?
- если ваше приложение использует и Symfony и Битрикс, то вы уже используете event-dispatcher и будет удобнее регистрировать обработчики единым образом;
- вы хотите работать с типизированными объектами событий, которые смогут предоставить удобный интерфейс к своим данным.
Как это работает
- запускается хит;
- в процессе кто-то требует сервис EventDispatcherInterface;
- контейнер создаёт этот сервис и благодаря штатному функционалу Symfony (RegisterListenersPass) добавляет в него слушателей (addListener);
- для тех вызовов addListener, которые регистрируют событие с интерфейсом \Maximaster\BitrixEvents\Contract\Event дополнительно вызывается код, который регистрирует обработчик события Битрикс. Это всегда ForwardListener
- Битрикс вызывает событие
- приходим в ForwardListener::__invoke;
- из аргументов пришедших в событие создаётся объект события из этого пакета;
- этот объект события отправляется в Symfony EventDispatcherInterface;
- штатный функционал Symfony отрабатывает и вызывает обработку события, которое было зарегистрировано на шаге 3.
Ограничения и нюансы
- Даже если вы регистрируете 100 обработчиков на одно и то же событие с помощью библиотеки, то в Битриксе будет зарегистрирован лишь один (ForwardListener) обработчик. Как следствие, отсортировать порядок выполнения обработчиков, которые сделаны в рамках этой библиотеки, однако, отсортировать их выполнения относительно других обработчиков невозможно;
- Если событие старого типа позволяет менять данные, то важно не только принимать в конструкторе данные по ссылке, но и по ссылке сохранять эти данные в свойство, иначе редактирование будет невозможно.
Доработка библиотеки
- установите devbox, либо самостоятельно
воспроизведите окружение, которое через него описано (см.
devbox.json
); - убедитесь, что линтеры не выдают ошибок (
devbox run lint
).