我在构造函数中定义了几个依赖注入的服务。在某些时候,我希望将服务作为新实例而不是已创建的同一实例。请注意,通常我希望共享服务,但在边缘情况下我想创建一个新实例,因此服务定义中的共享选项不适用。
我可以创建一个新对象,但是我必须手动注入依赖项,我宁愿让symfony来处理它。
那么如何告诉Symfony将服务作为新实例返回?
谢谢。
答案 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。