Symfony - 在 Bundle 中创建自己的配置 (service.yaml)

Symfony - Creating Own Config (service.yaml) Inside Bundle

我尝试了很多时间,但也许这是不可能的。 对不起,我的语言不好。 所以,我按照 Symfony Doc https://symfony.com/doc/current/bundles.html to create new Bundle, and than I followed https://symfony.com/doc/current/bundles/extension.html 创建了 DI 扩展。

我的文件: AcmeHelloExtension.php

namespace App\Acme\HelloBundle\DependencyInjection;

use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class AcmeHelloExtension extends Extension
{

    public function load(array $configs, ContainerBuilder $container)
    {
        $loader = new XmlFileLoader(
            $container,
            new FileLocator(__DIR__.'/../Resources/config')
        );
        $loader->load('services.xml');
    }
}

AcmeHelloBundle.php


namespace App\Acme\HelloBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class AcmeHelloBundle extends Bundle
{

}

我添加到config/bundles。php

src/Acme/HelloBundle/Resources/config/services.yaml

services:
    App\Acme\HelloBundle\AcmeHelloBundle:
        tags: ['example-tags']

此服务文件不是自动加载的,我需要执行后续步骤还是它应该可以工作?当我用 debug:container ....bundle... 检查它时 Option-Tags 具有空值。当我将此代码放入 config/services.yaml 时,它起作用了。

基本问题是包的源代码位于项目的 src 目录下:

project
    src
        Ztest
            ZtestBundle.php

这反过来又导致捆绑包的服务被应用程序的 config/services.yaml 文件自动装配:

# project\config\services
    App\:
        resource: '../src/'
        exclude:
            - '../src/DependencyInjection/'
            ...
            - '../src/Ztest' # Add this to fix the problem

排除包的源代码修复了问题。应用程序级别的自动装配会覆盖在捆绑包级别完成的任何手动装配。

当然,一般来说,如果您决定需要一个包,那么它的源代码应该在它自己的独立目录中:

project
    src
    src-ztest-bundle

为此,您还需要更新 composer.json 和 运行“作曲家 dump-autoload”的 psr-4 部分。

请记住,在 Symfony 4+ 中,自定义包的唯一推荐用法是用于跨多个 Symfony 应用程序共享的代码。在这种情况下,bundle 最终应该在它自己的存储库和 composer 包中结束。

但是,仍然支持应用程序内部的自定义包,有时它们会派上用场。