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

events-router

Любая система начинается не с кода, а с того, что в ней происходит. Заказ оформили, оплатили, отменили. Пользователь зарегистрировался. Платёж не прошёл. На каждое такое событие кто-то должен отреагировать: списать товар со склада, отправить письмо, начислить бонусы, предупредить CRM.

Пока событий пять, всё это живёт в одном методе. Когда их пятьдесят, реакции расползаются по коду, а на вопрос «что вообще происходит, когда заказ оплачен?» уже никто не отвечает без поиска по проекту.

events-router решает именно это. Все реакции на события описываются в одном файле — так же, как HTTP-маршруты в Slim:

<?php

return static function (EventRouter $events): void {

    $events->setPrefix('shop');

    $events->group('order', static function (RouteGroup $group): void {
        $group->listen('created', Listener\Order\ReserveStock::class);
        $group->listen('created', Listener\Order\SendConfirmationEmail::class);

        $group->group('{order_id}', static function (RouteGroup $order): void {
            $order->listen('paid', Listener\Order\MarkOrderPaid::class);
            $order->listen('paid', Listener\Bonuses\AccrueBonuses::class);
        })
            ->add(Middleware\Idempotency\IdempotencyGuard::class);
    })
        ->add(Middleware\EventLog\EventLogger::class);
};

Открыли файл — и видно всё: какие события есть, кто на них слушает, в каком порядке и через какие middleware. Без поиска по атрибутам, без подписчиков, разбросанных по папкам, без приоритетов, которые приходится держать в голове.

До версии 1.0

API ещё может меняться в минорных версиях. Что изменилось и как обновиться — в списке изменений.

Для кого

Для PHP-разработчиков, которые пишут маршруты в Slim и хотят так же писать реакции на события. Для проектов на Bitrix и без него, для синхронной рассылки из кода и для воркеров очередей. Если вы знаете, как устроен $app->group(...)->add(...), документация вам почти не понадобится. Почти.

Чем отличается от привычных диспетчеров

symfony/event-dispatcher symfony/messenger events-router
Как выбирается слушатель точное имя события, порядок — приоритет класс сообщения → шина/транспорт шаблон топика (order.{id}.paid, order.*)
Middleware нет общие на всю шину на маршрут и на группу, с наследованием
Группы, префиксы нет нет есть, как в Slim
Где описаны маршруты атрибуты и подписчики по всему коду конфиг маршрутизации один декларативный файл

Язык

Документация — на русском. Сообщения библиотеки — исключения и лог — по умолчанию на русском, на английском — с ключом конфига 'locale' => 'en', см. Конфигурацию.

Как устроена документация

Документация разделена по тому, зачем вы сюда пришли.

Раздел Когда открывать
Обучение вы здесь впервые и хотите за десять минут получить работающий роутер
Рецепты есть конкретная задача: подключить контейнер, настроить лог, запустить воркер
Справочник нужно точно: синтаксис шаблонов, методы маршрутов, ключи конфига, поля отчёта
Как это устроено хочется понять, почему библиотека сделана именно так
Ошибки библиотека бросила исключение, и в тексте ссылка сюда
Справочник API все публичные классы и методы, собирается из кода

Каждый пример на сайте — настоящий PHP-файл. Он выполняется в CI, а его вывод сверяется с тем, что напечатано на странице. Документация не может тихо разойтись с кодом: сборка просто не пройдёт.