我在构造函数中使用多个依赖项注入(inject)定义了一个服务。在某些时候,我想将服务作为一个新实例而不是已经创建的同一个实例。请注意,通常我希望共享服务,但在边缘情况下我想创建一个新实例,因此服务定义中的共享选项不适用。
我可以创建一个新对象,但我必须手动注入(inject)依赖项,我更愿意让 symfony 来处理它。
那么我该如何告诉 Symfony 将服务作为新实例返回呢?
谢谢。
最佳答案
据我所知,没有办法告诉 Symfony 依赖注入(inject)容器有时返回共享实例,有时返回新的服务实例。
默认情况下,服务是共享的,正如您已经发现的那样。你可以告诉容器create a not-shared service通过在您的服务定义中将 shared
设置设置为 false
:
# app/config/services.yml
services:
AppBundle\SomeNonSharedService:
shared: false
有了这些知识,我认为您的问题的解决方案是使用不同的名称创建共享服务的副本,并将其标记为未共享,如上文所述。当您要求容器获取副本时,它每次都会创建一个新实例。
不要尝试创建副本作为原始服务的别名,这是行不通的。第一件事执行Contaner::get()
所做的是在别名列表中搜索作为参数提供的服务 ID,如果在那里找到它,则使用原始服务的 ID。
关于php - Symfony 创建新服务作为新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47268892/