我想为我的存储库启用轻松的自动装配。同时,我需要能够在它们上切换数据库连接(因此在具有不同数据库连接的services.yaml中定义它们)
我从实现了ServiceEntityRepositoryInterface
并扩展EntityRepository
的BaseRepository扩展了所有存储库。
构造函数如下:
public function __construct(ManagerRegistry $registry, $entityClass, $connection = "default")
{
$manager = $registry->getManager($connection);
parent::__construct($manager, $manager->getClassMetadata($entityClass));
}
现在,我大多数存储库本身的构造函数如下:
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, MyEntity::class);
}
有些人有一个额外的$connection
参数以允许覆盖其连接。因为有时我需要回购访问不同的数据库。
这在我的前端非常有效,并且只需自动接线即可,除了在services.yaml中对所有服务/存储库的一般加载之外,甚至无需定义任何内容。
在测试中,我也想获取这些存储库。
我在基础测试课程中这样做
$this->em = $this->bootedKernel->getContainer()->get('doctrine')->getManager();
在测试中我想做
$this->myRepo = $this->em->getRepository(MyEntity::class);
这可怕地失败了
RuntimeException: The "\Moebel\MyApp\Repository\MyEntityRepository" entity repository implements "Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepositoryInterface", but its service could not be found. Make sure the service exists and is tagged with "doctrine.repository_service
我尝试在services.yaml中标记存储库,但没有区别。我查看了一些symfonfy代码,并看到了以下内容:
(在ContainerRepositoryFactory
中)
return $this->managedRepositories[$repositoryHash] = new $repositoryClassName($entityManager, $metadata);
我没有读很多symfony代码,但是在我看来,getRepository使用的代码使用entityManager调用我的类,这对我来说是错误的。我想要ManagerRegistry。
解决我的教义和存储库问题的最佳方法是什么?
编辑:我找到了一个解决方案,但不是所有问题。 直接使用容器,而不是让学说这样获取回购协议:
self::$container->get(MyEntityRepository::class);
也许有人有更好的主意?因为现在我无法获得具有不同连接的Repos,或者不确定如何。