Перейти к содержанию

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:

BitrixEventBridge::dispatch(new Event('shop.order.42.paid', $order));

  • 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 — один раз на процесс.

BitrixEventBridge::dispatch(new Event('shop.order.' . $order->getId() . '.paid', $order));
  • 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.

public static topic(string $moduleId, string $eventType): string

Точка в id партнёрского модуля — разделитель сегментов топика, поэтому она кодируется как ~: topic('rasa.shop', 'OnOrderExport') → rasa~shop.OnOrderExport. Для модулей без точки (main, iblock, sale) можно писать топик руками.

  • This method is static. Parameters:
Parameter Type Description
$moduleId string
$eventType string