Symfony getRepository не работает в тестах с ServiceEntityRepositories - PullRequest
0 голосов
/ 22 февраля 2019

Я хочу включить легкое автоматическое подключение для моих репозиториев.В то же время мне нужно иметь возможность переключать соединения с БД на них (поэтому определите их в services.yaml с различными значениями db conn)

Я расширяю все свои репо из BaseRepository, который реализует ServiceEntityRepositoryInterface и расширяет EntityRepository

Конструктор выглядит так:

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

InТесты Я хочу получить эти репозитории также.

Я делаю это в базовом тестовом классе

$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, который не подходит для меня.Я хочу, чтобы менеджер Registry.

Какой лучший способ исправить мои проблемы с Doctrine и репозиториями?

Редактировать: Я нашел решение, но не для всех проблем.Непосредственно используя контейнер и не позволяя доктрине получить репо, вот так:

self::$container->get(MyEntityRepository::class);

Может, у кого-нибудь есть идея получше?Потому что теперь я не могу получить Repos с другими связями, или я не уверен, как.

...