0

https://symfony.com/doc/current/event_dispatcher.html为例

class ExceptionSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        // return the subscribed events, their methods and priorities
        return [
            KernelEvents::EXCEPTION => [
                ['processException', 10],
                ['logException', 0],
                ['notifyException', -10],
            ],
        ];
    }
}

假设可以在运行时更改此列表是否正确?

例如

class ExceptionSubscriber implements EventSubscriberInterface
{
    protected $someToggle = false;

    public static function getSubscribedEvents()
    {
        if ($this->someToggle) {
            return [KernelEvents::EXCEPTION => ['processException']]
        }

        return [
            KernelEvents::EXCEPTION => [
                ['processException', 10],
                ['logException', 0],
                ['notifyException', -10],
            ],
        ]
    }
}

这是合法的和取消订阅logExceptionnotifyException当我$someToggle在运行时设置?

4

1 回答 1

2

不,您不能通过向getSubscribedEvents():array方法添加逻辑来动态更改订阅者监听的事件。

该方法仅在构建容器时在编译器传递期间运行,因此仅在清除缓存后才会执行。

尝试在运行时更改此设置将无效。

这样做的实际方法是将这个逻辑放入侦听器/订阅者的“工作”部分:

public function processException(ExceptionEvent $event)
{

    if (!$this->shouldProcessException()) {
        return;
    }
}

shouldProcessException()除非获得价值是昂贵的,否则性能损失将非常小或可以忽略不计。

于 2021-04-08T09:02:39.103 回答