Symfony 4 - 如何在自动装配整个路径时使用服务标签

问题描述 投票:2回答:1

我正在研究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']

所以,我想知道是否有一个我找不到的解决方法,或者我应该手动添加每个服务?

编辑:能够在类中使用注释是一个很好的功能,所以当它加载时它“知道”它的标签,但我认为它相反的方式,加载一个类因为被标记为某个标签。

php symfony service configuration autowired
1个回答
1
投票

您可以在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');
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.