我正在做一个项目,基本上它是一个包含2个领域的项目:主要前端(主要用于客户)和后端(用于员工管理事情,这是通过/admin
访问)。现在,对于前端和后端,我们有几个事件订阅者。
问题是,每个订户都有一个KernelEvents::CONTROLLER
功能。但不管控制器是什么,不管子控制器是什么;等等,所有这些都会被执行。
我的问题是,是否有可能将EventSubscribers绑定到一个特定的路径,一组控制器或其他东西,这样,并不是所有的事件订阅者与KernelEvents::CONTROLLER
得到调用每次有人去网站?我知道我可以内置if语句,但仍然会为所有这些事件订阅者做DI,即使路由不需要特定的订阅者,它们也会被调用。
(我没有更好的显示,我试着搜索这个,但我没有得到任何答案,或者也许我不理解文档。)至于代码:
public static function getSubscribedEvents() {
return [
KernelEvents::CONTROLLER => 'onControllerEvent'
];
}
这基本上是我在多个事件订阅者中所拥有的,当然,在构造函数中注入的模块和onControllerEvent
函数内部的函数不同,希望这澄清了任何问题)
KernelEvents::CONTROLLER
事件的所有侦听器/订阅者接收一个ControllerEvent
对象,其中包含Request
对象(参见https://github.com/symfony/symfony/blob/5.4/src/Symfony/Component/HttpKernel/HttpKernel.php#L139)。通过Request
对象,您可以根据侦听器/订阅器中的路径进行区分。这可能不是最佳实践,但您可以这样做。
所有的听众/订阅者仍然会开火,正如@Cerad所说。但是,您可以在执行与性能相关的代码之前中止事件的处理。