Doctrine 为什么自动连线为事件订阅服务器提供不同的实体管理器实例?
我在一个symfony4项目中提供了不同的服务,这让实体经理得到了注入。我发现,条令事件订阅者和他们使用的服务获得的实体管理器实例与其他服务不同,当您调用self:$container->get('doctor')->getManager()时。在我的项目中,我已经看到了多达三个不同的实例,但我不知道在什么情况下会创建更多的实例 我已经向所有构造函数添加了函数spl\u object\u id,以查看对象使用的是实体管理器的哪个实例。下面的代码有两个服务和一个事件订阅服务器。事件订阅服务器使用第一个服务。我希望所有这些都使用同一个entity manager实例,因为服务容器的一般思想是,特定类型的对象只创建一次。但显然创建了两个实体管理器实例,一个用于事件订阅者及其使用的所有服务,另一个用于所有其他服务 TestService1.php:Doctrine 为什么自动连线为事件订阅服务器提供不同的实体管理器实例?,doctrine,symfony4,autowired,Doctrine,Symfony4,Autowired,我在一个symfony4项目中提供了不同的服务,这让实体经理得到了注入。我发现,条令事件订阅者和他们使用的服务获得的实体管理器实例与其他服务不同,当您调用self:$container->get('doctor')->getManager()时。在我的项目中,我已经看到了多达三个不同的实例,但我不知道在什么情况下会创建更多的实例 我已经向所有构造函数添加了函数spl\u object\u id,以查看对象使用的是实体管理器的哪个实例。下面的代码有两个服务和一个事件订阅服务器。事件订阅服务器使用第
我认为,这种行为与phpunit和/或KernelTestCase/WebTestCase有关,但这只是部分原因
我创建了一个控制器来使用对象:
在搜索PHP单元测试的问题时,给了我一个错误“通过关系找到了一个新实体”,我偶然发现了这个答案。这让我意识到我有两个实体经理。在我的测试构造函数中,我正在引导内核,但当我将其移动到测试本身时,我只能得到一个EntityManager。谢谢你的回答!
services:
.....
App\Service\TestSubscriber:
tags:
- { name: doctrine.event_subscriber}
App\Service\TestService1:
public: true
App\Service\TestService2:
public: true
Manager from TestService1: 2897
Manager from TestSubscriber: 2897
Manager from TestService2: 3695
Testservice1 in controller: 2897
Testservice2 in controller: 3695
Manager from TestService1: 60
Manager from TestSubscriber: 60
Manager from container 1: 399
Manager from TestService1: 434
Manager from TestSubscriber: 434
Manager from container 2: 507
Manager from TestService2: 507
Manager from container 3: 507