Есть ли способ в моем методе обработчика определить, какое из подписанных событий инициировало обработчик?
Предполагая, что у меня есть 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'
}