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

Psr14EventDispatcher

Роутер под стандартным интерфейсом PSR-14 — для кода и библиотек, которые знают только Psr\EventDispatcher\EventDispatcherInterface.

Как из объекта получается событие:

  • объект реализует EventInterface — рассылается как есть;
  • иначе имя события даёт маппер из конструктора, а сам объект становится payload.

Объект без EventInterface и без маппера — исключение UnmappableEvent: имя события не угадывается по имени класса.

$dispatcher = new Psr14EventDispatcher(
    $events,
    static fn (object $event): string => match (true) {
        $event instanceof OrderPaid => 'shop.order.' . $event->orderId . '.paid',
    },
);

$dispatcher->dispatch(new OrderPaid(42, 1500));   // слушатели получат OrderPaid в getPayload()

Как требует PSR-14, dispatch() возвращает тот же объект, что получил. Остановка рассылки через StoppableEventInterface работает: роутер проверяет и событие, и payload.


  • Full name: \Selyusize\EventsRouter\Psr14\Psr14EventDispatcher
  • This class is marked as final and can't be subclassed
  • This class implements: EventDispatcherInterface
  • This class is a Final class

Methods

__construct

public __construct(\Selyusize\EventsRouter\EventRouter $router, callable|null $topic = null): mixed

Parameters:

Parameter Type Description
$router \Selyusize\EventsRouter\EventRouter
$topic callable|null имя события для объекта без EventInterface

dispatch

public dispatch(\Selyusize\EventsRouter\Psr14\T $event): \Selyusize\EventsRouter\Psr14\T

Parameters:

Parameter Type Description
$event \Selyusize\EventsRouter\Psr14\T

Throws:

если имя события неизвестно - UnmappableEvent если маппер вернул некорректное имя - InvalidEventName