【问题标题】:Symfony2 kernel.controller event for single controller or bundle scope单个控制器或捆绑范围的 Symfony2 kernel.controller 事件
【发布时间】:2015-04-18 23:31:34
【问题描述】:

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

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

如何避免这种行为?如何仅定义每个捆绑包或更好的每个控制器的侦听器?也许,它可以在特定于 bundle 的 services.yml 中定义,但这对于监听器的范围也太宽了,在一些控制器中使用。

【问题讨论】:

  • 您可能混淆了控制器和侦听器的概念。令牌侦听器是请求侦听器,并在控制器已知之前进行处理,因此为每个控制器分配侦听器几乎没有意义。查看 HttpKernel::handle 代码以了解工作流程。它并没有你想象的那么糟糕。

标签: php symfony events controller kernel


【解决方案1】:

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

如果您还查看侦听器的代码,您会发现它已经只在控制器是TokenAuthenticatedController 的实例时执行“复杂逻辑”。这意味着它已经完全按照你说的做:只对某些控制器执行。

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

当控制器不是TokenAuthenticatedController 的实例时阻止调用侦听器意味着您只是将 instanceof 检查从侦听器转移到侦听器之前的方法,最终得到完全相同的开销。

p>

【讨论】:

  • 例如,我的应用程序有数十个侦听器(丰富的事件驱动应用程序),因此,每个侦听器都会在每个请求时被调用,我想这会带来不必要的开销。在这种情况下,响应延迟会增加,而 RPS 会降低。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 2014-07-02
相关资源
最近更新 更多