【问题标题】:symfony2 event dispatcher lazy loading listenersymfony2 事件调度器延迟加载监听器
【发布时间】:2023-03-22 19:08:01
【问题描述】:

我正在使用 Symfony Event Dispatcher 创建一些我自己的事件,效果很好。

但是我注意到,我在 symfony 中配置的监听器不是延迟加载的,它总是被初始化的。 然而,它很少使用。

我的 services.yml 中的配置如下所示:

my.handler:
    class: Acme\AcmeBundle\DependencyInjection\MyHandler
    arguments:
      - @my.dependency
    tags:
      - { name: kernel.event_listener, event: my.event, method: handle }

有没有办法以这样的方式配置它,即@my.handler 仅在事件触发时才被初始化? 因为现在它在被推送到 Dispatcher 时被初始化(连同它的所有依赖项)。

有关于 ContainerAwareEventDispatcher 的文档: http://symfony.com/doc/current/components/event_dispatcher/container_aware_dispatcher.html 但这只是说明如何在 PHP 中直接使用它,而不是如何在标准的 symfony2 项目中进行配置。

【问题讨论】:

  • 实际上服务应该是延迟加载的,但另一点是,ctor 必须便宜。只需将您的 ctor 参数保存到私有属性即可。不要做任何连接或检查,所以不管它是否延迟加载。
  • 是的,所有服务都是延迟加载的,但在使用时它们的依赖关系也是如此。在 Symfony 中总是使用 EventDispatcher,所以所有的监听器总是被加载,包括它们的依赖。在每个服务中实施“延迟连接”策略需要大量自定义代码。在这些情况下延迟加载服务为常见问题提供了通用解决方案,甚至适用于第三方服务。
  • 另外,构造函数不应该便宜,只需要服务需要的东西。服务应该尽可能小,并尽可能将一些任务委托给其他服务。如果你让服务本身“便宜”,构造函数也会变得“便宜”。

标签: php symfony events dispatcher lazy-initialization


【解决方案1】:

您可以将其定义为 Lazy Services 添加相关标签(如 here 所述),例如:

my.handler:
    class: Acme\AcmeBundle\DependencyInjection\MyHandler
    lazy: true
    arguments:
      - @my.dependency
    tags:
      - { name: kernel.event_listener, event: my.event, method: handle }

记得按照文档中的说明安装 ProxyManager 网桥

希望有帮助

【讨论】:

  • 按照链接文档中的说明工作。 ProxyManagerBridge 已经安装在 full-stack-symfony 中,它是 ocramius/proxy-manager 你仍然需要通过 composer 添加。
  • 另外,延迟加载侦听器的依赖项而不是侦听器本身可能会更好(或更快)。但我没有测试。当使用订阅者(而不是侦听器)时,您必须这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 2016-11-30
相关资源
最近更新 更多