Symfony getRepository无法在带有ServiceEntityRepositories的测试中工作

时间:2019-02-22 07:50:39

标签: php symfony doctrine repository

我想为我的存储库启用轻松的自动装配。同时,我需要能够在它们上切换数据库连接(因此在具有不同数据库连接的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,或者不确定如何。

0 个答案:

没有答案