单个控制器或捆绑范围的 Symfony2 kernel.controller 事件

Symfony2 kernel.controller event for single controller or bundle scope

我在阅读本文时发现的一个小但重要的细节问题:http://symfony.com/doc/current/cookbook/event_dispatcher/before_after_filters.html

手册说,声明的 TokenListener 将在每个请求 上执行。所以,如果我有一个带有很多控制器(或带有自己的控制器的捆绑包)和许多其他类型的事件监听器的大型应用程序,这种行为会增加开销:每个事件监听器将在每个请求中执行每捆!例如,我有默认的 AppBundle 和 ApiBundle,在给定的示例中,TokenListener 在请求两个包的情况下执行,因为在应用特定配置中定义:app/config/services.yml

如何避免这种行为?如何只为每个包定义监听器,或者更好的是,为每个控制器定义监听器?也许,它可以在特定的包中定义 services.yml,但这对于在一些控制器中使用的监听器来说范围太广了。

请注意,您每次打开一个页面时可能只有一个请求(子请求除外)。因此,侦听器仅被调用一次。

如果您还查看侦听器的代码,您会发现当控制器是 TokenAuthenticatedController 的实例时,它已经只执行 "complex logic"。这意味着它已经完全按照你说的做了:只对某些控制器执行。

唯一的开销是监听器的调用。这不会增加太多开销。

当控制器不是 TokenAuthenticatedController 的实例时,采取措施防止调用侦听器意味着您只是将 instanceof 检查从侦听器转移到侦听器之前的方法,结果完全相同开销。