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, а его вывод сверяется с тем, что напечатано на странице. Документация не может тихо разойтись с кодом: сборка просто не пройдёт.