Я работаю над пакетом для Symfony 4, который структурирован следующим образом:
\Acme
\FooBundle
\Article
\Entity
- Article.php
- Comment.php
\Form
- ArticleType.php
\Repository
- ArticleRepository.php
- CommentRepository.php
- ArticleManager.php
\User
\Entity
- User.php
\Repository
- UserRepository.php
- UserManager.php
\SomethingElse
\Entity
- SomethingElse.php
\Repository
- SomethingElseRepository.php
- SomethingElseManager.php
Есть еще много папок и сущностей, но это не имеет значения для вопроса.
Автосвязывание всех классов в этой папке можно создать с помощью такой конфигурации:
Acme\FooBundle\:
resource: '../../*/{*Manager.php,Repository/*Repository.php}'
exclude: '../../{Manager/BaseManager.php,Repository/BaseRepository.php}'
autowire: true
Но когда вам нужно добавить служебные теги, такие как doctrine.repository_service
, такая конфигурация больше не поможет. Без тега при использовании в контроллере, например:
$this->getDoctrine()->getRepository(Bar::class)
or
$this->getDoctrine()->getManager()->getRepository(Bar::class)
выдает ошибку:
Репозиторий сущностей "Acme\FooBundle\SomethingElse\Repository\SomethingElseRepository" реализует "Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepositoryInterface", но его службу найти не удалось. Убедитесь, что сервис существует и помечен тегом «doctrine.repository_service».
Дело в том, что, поскольку все они находятся в одной корневой папке, мне не разрешено использовать конфигурацию, подобную следующей, потому что она будет дублировать ключи Acme\FooBundle\
:
Acme\FooBundle\:
resource: '../../*/{*Manager.php}'
exclude: '../../{Manager/BaseManager.php}'
autowire: true
Acme\FooBundle\:
resource: '../../*/{Repository/*Repository.php}'
exclude: '../../{Repository/BaseRepository.php}'
autowire: true
tags: ['doctrine.repository_service']
Итак, мне было интересно, есть ли обходной путь, который я не смог найти, или мне нужно просто вручную добавить каждую службу?
Редактировать: Было бы неплохо иметь возможность использовать аннотацию в классе, чтобы при загрузке он «знал» свой тег, но я думаю, что это работает наоборот, загружая класс, потому что он был помечен определенным тегом.
*Manager.php
и*Repository.php
, поэтому сущности не являются службами. - person VMC   schedule 10.04.2018