Есть ли способ в моем методе обработчика определить, какое из подписанных событий инициировало обработчик?

Предполагая, что у меня есть EventListener, помеченный более чем одним именованным событием, или EventSubscriber, который подписывается на более чем одно событие, как я могу в своем методе обработчика определить, какое из подписанных событий инициировало обработчик?

В sylius все события ресурсов используют (потомок) класса Generic Event.

Я вижу, что имя события не содержится в классе событий, поэтому как я могу определить, какое из подписанных событий вызвало запуск обработчика?

    public static function getSubscribedEvents()
    {
        return [
            'sylius.order.post_complete' => 'dispatchMessage',
            'sylius.customer.post_register' => 'dispatchMessage',
        ];
    }

ОБНОВЛЕНИЕ: я знаю, что в этом случае я мог бы позвонить get_class($event->getSubject()) и, по крайней мере, знаю, с каким ресурсом я имею дело, однако я ищу более общее решение, которое будет работать в любом проекте Symfony.

1 ответ

Решение

Обратным вызовам передается больше параметров, чем просто объект события (вы можете столкнуться с ними, вызвав func_get_args() внутри вашего обратного вызова (dispatchMessage) быстрее, чем в документации:-)). Они не являются обязательными, но содержат то, что вам может понадобиться.

Обратный вызов вызывается с параметрами:
- событие (объект)
- имя события (то, что вы ищете)
- экземпляр диспетчера

(см. https://github.com/symfony/event-dispatcher/blob/master/EventDispatcher.php)

Итак, в вашем случае вы можете использовать следующее:

public static function getSubscribedEvents()
{
    return [
        'sylius.order.post_complete' => 'dispatchMessage',
        'sylius.customer.post_register' => 'dispatchMessage',
    ];
}

public function dispatchMessage(GenericEvent $event, string $eventName, EventDispatcherInterface $eventListener)
{
    // Here, $eventName will be 'sylius.order.post_complete' or 'sylius.customer.post_register'
}
Другие вопросы по тегам