我正在研究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']
所以,我想知道是否有一个我找不到的解决方法,或者我应该手动添加每个服务?
编辑:能够在类中使用注释是一个很好的功能,所以当它加载时它“知道”它的标签,但我认为它相反的方式,加载一个类因为被标记为某个标签。
您可以在Kernel / Main Bundle类中自动配置标记:
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');
}
}