在我的处理程序方法中,是否可以确定哪些订阅事件触发了处理程序?

时间:2019-09-18 14:33:08

标签: symfony events sylius sylius-resource

假设我有一个标记有多个命名事件的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>

1 个答案:

答案 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'
}