Symfony将新服务创建为新实例

时间:2017-11-13 16:19:25

标签: php symfony

我在构造函数中定义了几个依赖注入的服务。在某些时候,我希望将服务作为新实例而不是已创建的同一实例。请注意,通常我希望共享服务,但在边缘情况下我想创建一个新实例,因此服务定义中的共享选项不适用。

我可以创建一个新对象,但是我必须手动注入依赖项,我宁愿让symfony来处理它。

那么如何告诉Symfony将服务作为新实例返回?

谢谢。

1 个答案:

答案 0 :(得分:6)

据我所知,没有办法告诉Symfony Dependency Injection Container多次返回共享实例,有时则返回新服务实例。

默认情况下,服务是共享的,正如您已经发现的那样。您可以通过在服务定义中将shared设置为false来告知容器create a not-shared service

# app/config/services.yml
services:
    AppBundle\SomeNonSharedService:
        shared: false

有了这些知识,我认为您的问题的解决方案是使用不同的名称创建共享服务的副本,并将其标记为未共享,如上所述。当您要求容器获取副本时,它将每次创建一个新实例。

不要尝试将副本创建为原始服务的别名,它不起作用。 Contaner::get()的实现首先要做的是将作为参数提供的服务ID搜索到别名列表中,如果在那里找到它,则使用原始服务的ID。