假设我有一个标记有多个命名事件的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项目的通用解决方案。 / p>
答案 0 :(得分:0)
传递给回调的参数不仅仅是事件对象(与文档中的文档相比,您可以通过在回调(func_get_args()
)中调用dispatchMessage
来遇到这些参数)。它们不是强制性的,但包含您可能需要的内容。
以参数形式调用回调:
-事件(对象)
-活动名称(您要查找的内容)
-调度员实例
(请参阅https://github.com/symfony/event-dispatcher/blob/master/EventDispatcher.php#L231)
因此,您可以使用以下内容:
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'
}