Symfony创建新服务作为新实例。

5
我有一个在构造函数中定义多个依赖注入的服务。在某些情况下,我想获得该服务的新实例,而不是已经创建的相同实例。请注意,通常情况下我希望该服务是共享的,但是在某些特定情况下,我需要创建一个新实例,因此服务定义中的共享选项不适用。
我可以创建一个新对象,但是这样做就必须手动注入依赖项,而我更愿意让 Symfony 来处理它。
那么我应该如何告诉Symfony返回一个新实例的服务呢?
谢谢。
1个回答

9
据我所知,没有办法告诉Symfony依赖注入容器在某些情况下返回共享实例,在其他情况下返回服务的新实例。
默认情况下,服务是共享的,就像您已经发现的那样。您可以通过在服务定义中将shared设置为false来告诉容器创建一个非共享服务。具体操作请参考:创建非共享服务
# app/config/services.yml
services:
    AppBundle\SomeNonSharedService:
        shared: false

有了这个知识,我认为你的问题的解决方案是创建一个具有不同名称的共享服务副本,并按上述方法标记它为非共享。当您要求容器获取副本时,它将每次创建一个新实例。
不要尝试将副本创建为原始服务的别名,这样做不起作用。 Contaner::get() 的实现首先查找提供的服务ID参数是否在别名列表中,并在那里找到原始服务的ID时使用它。

1
我最终在服务中进行了重置操作,但我认为你的解决方案更加适合。谢谢! - David Rojo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接