【问题标题】:Symfony listener start after Twig extensions on first launchSymfony 监听器在第一次启动 Twig 扩展后启动
【发布时间】:2017-08-28 20:33:51
【问题描述】:

这是我的 service.yml :

services:
foo.builder:
    class: MyBundle\Core\MyClass

foo.twig_extension:
    class: MyBundle\Twig\BarExtension
    arguments: ['@foo.builder']
    tags:
        - { name: twig.extension }

foo.listener.foolistener:
  class: MyBundle\EventListener\MyListener
  arguments: ['@service_container']
  tags:
    -  { name: kernel.event_listener, event: kernel.controller, method: createFooObject }

我的听众总是在我的树枝扩展之前开始,这很好,但不仅仅是在清除缓存之后...... 我的应用程序总是第一次崩溃(在清除缓存或更改参数之后),因为我的 twig 扩展需要有一个对象已经被监听器水合。所以如果它之前启动,它通常会崩溃:(

1/有什么问题?

2/ 我怎样才能强制我的听众总是在树枝扩展之前开始?

欢迎提出建议

【问题讨论】:

  • 你不能。 Twig 扩展将始终在侦听器被调用之前创建。您需要做的是在调用 twig 过滤器或函数时获取您的对象。
  • 但是...只是第一次清除缓存后???
  • 您误解了关于缓存清除的结论。我假设 MyListener::createFooObject 的结果最终出现在您的扩展中?也许发布更多代码,也许我们可以确切地看到发生了什么。

标签: php symfony service listener twig-extension


【解决方案1】:

Event listeners 页面读取:

另一个可选的标签属性叫做priority,默认为0,它控制着监听器的执行顺序(优先级越高,监听器越早执行)。当您需要保证一个侦听器在另一个侦听器之前执行时,这很有用。 Symfony 内部侦听器的优先级通常范围从-255 到255,但您自己的侦听器可以使用任何正整数或负整数。

用命令列出你的听众和他们的优先级:

php app(or bin)/console debug:event-dispatcher

并为它分配适当的priority,如下所示。更新priority: 0。如果根本不设置,则优先级值默认为0。

- { name: kernel.whatever, event: kernel.whatever, method: whatever, priority: 0 }

【讨论】:

  • 问题当然是树枝扩展不是监听器。
猜你喜欢
  • 1970-01-01
  • 2015-12-29
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 2020-04-27
  • 2020-09-21
相关资源
最近更新 更多