【问题标题】:How to load a custom config file in a Bundleless application with Treebuilder?如何使用 Treebuilder 在 Bundleless 应用程序中加载自定义配置文件?
【发布时间】:2026-01-29 03:40:02
【问题描述】:

我正在尝试导入一个名为 test.yaml 的自定义配置文件。

我将 test.yaml 放在 config/packages/local 文件夹和 config/packages 文件夹中。

test.yaml 文件如下所示:

# config/packages/test.yaml
test1: 'hello'

当我编译应用程序时,我收到此错误:“没有扩展能够加载“test1”的配置

现在你要告诉我,我需要创建和扩展以及 blabla。但我想不通。有没有办法在不创建 Bundle 的情况下创建扩展。我在文档中找不到任何关于 Bundle 范围外扩展的示例。我的意思是我想在src 文件夹中创建它?

一个相关的问题是:如果我在这个例子中设置一个 TreeBuilder: https://symfony.com/doc/current/components/config/definition.html

是否可以避免创建扩展?

Symfony 版本是 5.1。

【问题讨论】:

    标签: php symfony symfony4


    【解决方案1】:

    好像几个月前我看到了一个类似的问题,但找不到。 src/Kernel 类充当 AppBundle 类,允许您执行注册扩展等操作。

    # src/Kernel.php
    class Kernel extends BaseKernel
    {
        use MicroKernelTrait;
    
        protected function prepareContainer(ContainerBuilder $container)
        {
            $container->registerExtension(new TestExtension());
            parent::prepareContainer($container);
        }
    ...
    # src/TestExtension.php
    class TestExtension extends Extension
    {
        public function load(array $configs, ContainerBuilder $container)
        {
            // TODO: Implement load() method.
            dump($configs);
        }
    }
    

    至于处理没有扩展的树构建器,我不知道这是否可能。配置的东西已经够复杂了,我自己不会去那里。

    有点跑题了,我找不到在内核中使用 prepareContainer 的实际记录案例。源代码清楚地表明上面显示的方法是可行的。

    大多数时候,应用特定的配置只是在 config 目录中完成。捆绑配置系统的要点是允许应用程序覆盖默认捆绑配置。我并没有真正看到应用级别扩展的意义。什么会覆盖它?也许某种复杂的数据库驱动的树生成器?似乎不太可能。

    这可能是因为您可以做某事并不意味着您应该做某事。

    【讨论】:

      【解决方案2】:

      对于自定义配置文件,我认为您可能需要添加参数:在顶部这样

      # config/packages/test.yaml
      parameters:
        test1: hello
      

      https://symfony.com/doc/current/configuration.html#configuration-parameters

      【讨论】: