【发布时间】: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