如何在Symfony 2中更改事件处理程序优先级

Sky*_*blo 9 event-handling symfony

我为"name:kernel.event_listener,event:kernel.request"定义了2个事件监听器,但是我可以做我想做的事情,我无法改变调用这个监听器的顺序.我尝试使用"优先"号码,但没有任何帮助.

这个事件总是在调用@first:

  MyBundle.Foo.Listener.RequestListener:
    class: %MyBundle.Foo.Listener.request.class%
    arguments: [ @session, @liip_theme.active_theme, @Need.some.infos.service ]
    tags:
      - { name: kernel.event_listener, event: kernel.request, method: onRequest, priority: 100 }
Run Code Online (Sandbox Code Playgroud)

并且此事件永远不会调用,因为第一个事件使用的服务依赖于此事件的信息,因此在触发此事件之前它会崩溃:

  MyBundle.Bar.Listener.RequestListener:
    class: %MyBundle.Bar.Listener.request.class%
    arguments: [ @session ]
    tags:
      - { name: kernel.event_listener, event: kernel.request, method: onRequest, priority: 200 }
Run Code Online (Sandbox Code Playgroud)

我也改变了"优先级",但没有改变:(

也许有人给我一个提示,我可以确保听众"MyBundle.Bar.Listener.RequestListener"会在另一个事件之前调用吗?

Sky*_*blo 8

问题是事件监听器类将在任何事件触发之前在Symfony启动时初始化.

我不得不将我的DI更改为:

  MyBundle.Foo.Listener.RequestListener:
    class: %MyBundle.Foo.Listener.request.class%
    arguments: [ @session, @liip_theme.active_theme, @service_container ]
    tags:
      - { name: kernel.event_listener, event: kernel.request, method: onRequest, priority: 0 }
Run Code Online (Sandbox Code Playgroud)

我使用了这个"@service_container"服务,并在事件内调用目标服务"@ Need.some.infos.service",一切正常.