BitrixEventBridge¶
Мост от EventManager Bitrix к роутеру: события Bitrix приходят в слушателей
из файла маршрутов, как любые другие.
Маршруты событий Bitrix — в группе bitrix, топик bitrix.<модуль>.<Событие>:
$events->group('bitrix', static function (RouteGroup $bitrix): void {
$bitrix->listen('main.OnAfterUserAdd', SendWelcomeEmail::class);
$bitrix->listen('iblock.OnBeforeIBlockElementUpdate', ValidateProduct::class);
});
Подключение — одна строка в local/php_interface/include/events.php:
BitrixEventBridge::attachLazy(
EventManager::getInstance(),
static fn (): EventRouter => Container::get(EventRouter::class),
$_SERVER['DOCUMENT_ROOT'] . '/local/var/cache/bitrix-events.php',
);
На каждое событие Bitrix мост регистрирует один обработчик [$bridge, 'bitrix.main.OnAfterUserAdd'],
а когда событие происходит — рассылает new Event('bitrix.main.OnAfterUserAdd', new BitrixEvent(...)).
Слушатель читает и меняет данные через BitrixEvent.
Свои события проекта рассылает dispatch() — тем же роутером, что и события Bitrix:
- Full name:
\Selyusize\EventsRouter\Bitrix\BitrixEventBridge - This class is marked as final and can't be subclassed
- This class is a Final class
Methods¶
dispatch¶
Разослать своё событие проекта тем же роутером, к которому подключён мост.
public static dispatch(\Selyusize\EventsRouter\Contract\Core\EventInterface $event): \Selyusize\EventsRouter\Dispatch\DispatchReport
В проекте на Bitrix нет общего места, где лежит роутер: события Bitrix приходят через мост, а свои события рассылаются отсюда — из компонента, контроллера, агента или слушателя события Bitrix. Маршруты, middleware, лог и обработка ошибок у них общие. После attachLazy() роутер собирается при первом событии — своём или Bitrix — один раз на процесс.
- This method is static. Parameters:
| Parameter | Type | Description |
|---|---|---|
$event |
\Selyusize\EventsRouter\Contract\Core\EventInterface |
Throws:
если мост не подключён или топик события — под префиксом событий Bitrix
- LogicException
attach¶
Зарегистрировать обработчики сразу по маршрутам роутера.
public static attach(\Bitrix\Main\EventManager $manager, \Selyusize\EventsRouter\EventRouter $router, string $prefix = 'bitrix'): void
Подходит для разработки и консольных скриптов. На каждом хите сайта роутер пришлось бы собирать целиком, поэтому на сайте используйте attachLazy().
- This method is static. Parameters:
| Parameter | Type | Description |
|---|---|---|
$manager |
\Bitrix\Main\EventManager | |
$router |
\Selyusize\EventsRouter\EventRouter | |
$prefix |
string | с чего начинаются топики событий Bitrix, включая префикс роутера |
Throws:
если маршрут под префиксом — не конкретное событие, а шаблон
- InvalidRoute
attachLazy¶
Зарегистрировать обработчики по списку событий из файла, а роутер собрать, только когда событие Bitrix действительно произошло.
public static attachLazy(\Bitrix\Main\EventManager $manager, callable $router, string $eventsFile, string $prefix = 'bitrix'): void
Нет файла — роутер собирается сразу, список событий записывается в файл. После изменения маршрутов файл нужно удалить, например при деплое.
- This method is static. Parameters:
| Parameter | Type | Description |
|---|---|---|
$manager |
\Bitrix\Main\EventManager | |
$router |
callable | |
$eventsFile |
string | PHP-файл со списком событий; папка создаётся сама |
$prefix |
string |
Throws:
если маршрут под префиксом — не конкретное событие, а шаблон
- InvalidRoute
topic¶
Сегмент топика для модуля и события Bitrix — для listen() в группе bitrix.
Точка в id партнёрского модуля — разделитель сегментов топика, поэтому она кодируется
как ~: topic('rasa.shop', 'OnOrderExport') → rasa~shop.OnOrderExport.
Для модулей без точки (main, iblock, sale) можно писать топик руками.
- This method is static. Parameters:
| Parameter | Type | Description |
|---|---|---|
$moduleId |
string | |
$eventType |
string |