Symfony 4 — как использовать служебные теги при автопроводке по всему пути

Я работаю над пакетом для 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']

Итак, мне было интересно, есть ли обходной путь, который я не могу найти, или мне просто нужно вручную добавить все службы?

Редактировать:
Было бы неплохо иметь возможность использовать аннотацию в классе, поэтому, когда он загружен, он «знает» его тег, но я думаю, что он работает наоборот, загружая класс, потому что он был помечен определенным тегом. тег.

2

Решение

Вы можете автоматически настроить теги в своем классе ядра / основного пакета:

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')
}
}
1

Другие решения

Других решений пока нет …