Я работаю над пакетом для 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)
или же
$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']
Итак, мне было интересно, есть ли обходной путь, который я не могу найти, или мне просто нужно вручную добавить все службы?
Редактировать:
Было бы неплохо иметь возможность использовать аннотацию в классе, поэтому, когда он загружен, он «знает» его тег, но я думаю, что он работает наоборот, загружая класс, потому что он был помечен определенным тегом. тег.
Вы можете автоматически настроить теги в своем классе ядра / основного пакета:
https://symfony.com/doc/current/service_container/tags.html#autoconfiguring-tags
<?php
namespace Acme\FooBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class FooBundle extends Bundle
{
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->registerForAutoconfiguration(EntityRepository::class)
->addTag('doctrine.repository_service')
}
}
Других решений пока нет …