【问题标题】:Symfony2 - why can't Symonfy load my YAML configurationSymfony2 - 为什么 Symonfy 不能加载我的 YAML 配置
【发布时间】:2016-05-24 03:11:05
【问题描述】:

我正在尝试在包中加载自定义 YAML 配置文件,但出现错误提示:

没有可以加载配置的扩展


自定义 YAML 配置文件:

#AppBundle/Resources/config/myconfig.yml
myapp: myvalue

配置文件:

//AppBundle/DependencyInjection/MyConfiguration.php

namespace AppBundle\DependencyInjection;

use ...

class MyConfiguration implements ConfigurationInterface {

    public function getConfigTreeBuilder() {
        $treeBuilder = new TreeBuilder();
        $treeBuilder->root('myapp')->end();

        return $treeBuilder;
    }

}

扩展文件:

//AppBundle/DependencyInjection/AppExtension.php

namespace AppBundle\DependencyInjection;

use ...

class AppExtension extends Extension {

    public function load(array $configs, ContainerBuilder $container)
    {
        $this->processConfiguration(new MyConfiguration(), $configs);

        $loader = new YamlFileLoader(
            $container,
            new FileLocator(__DIR__.'/../Resources/config')
        );

        $loader->load('myconfig.yml');
    }   

}

完整的错误信息:

YamlFileLoader.php 第 399 行中的 InvalidArgumentException: 没有扩展能够加载“myapp”的配置(在 C:\my_project\src\AppBundle\DependencyInjection/../Resources/config\myconfig.yml 中)。寻找命名空间“myapp”,没有找到


【问题讨论】:

    标签: php symfony-2.8


    【解决方案1】:

    这是因为您使用了 myapp 自定义别名。

    第一种解决方案:使用默认别名

    Symfony 默认使用下划线版本的包名称(例如,AcmeTestBundle 将转换为 acme_test)。

    考虑到您的包命名空间,app 别名将是默认值。

    您可以更改此代码:

    $treeBuilder->root('myapp')->end();
    

    进入这个:

    $treeBuilder->root('app')->end();
    

    然后在您的配置文件中使用app 键。

    这是首选解决方案,因为它使您的配置与您的捆绑包名称匹配。如果配置名称不适合你,可能是因为 bundle 没有正确命名!

    替代解决方案:保留您的自定义别名

    您的应用中可能只有一个捆绑包,称为AppBundle,因为您不打算在任何其他项目中重复使用此捆绑包。如果您仍想使用自定义别名(myapp 而不是 app),可以这样做:

    <?php
    //AppBundle/DependencyInjection/AppExtension.php
    
    namespace AppBundle\DependencyInjection;
    
    use ...
    
    class AppExtension extends Extension {
    
        public function load(array $configs, ContainerBuilder $container)
        {
            // ...
        }
    
    
        public function getAlias()
        {
            return 'myapp';
        }
    }
    

    因为 Symfony 默认不喜欢这个别名,所以也要更改你的 Bundle 文件:

    <?php
    // AppBundle/AppBundle.php
    namespace AppBundle;
    
    use Symfony\Component\HttpKernel\Bundle\Bundle;
    use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
    
    class AppBundle extends Bundle
    {
        /**
         * {@inheritdoc}
         */
        public function getContainerExtension()
        {
            if (null === $this->extension) {
                $extension = $this->createContainerExtension();
    
                if (null !== $extension) {
                    if (!$extension instanceof ExtensionInterface) {
                        throw new \LogicException(sprintf('Extension %s must implement Symfony\Component\DependencyInjection\Extension\ExtensionInterface.', get_class($extension)));
                    }
    
                    $this->extension = $extension;
                } else {
                    $this->extension = false;
                }
            }
    
            if ($this->extension) {
                return $this->extension;
            }
        }
    }
    

    【讨论】:

    • myapp改成app,还是一样的错误。我还从Configuration 类和config yaml 文件中删除了my 前缀。 (更改在 repo 中)
    • $rootNode 转储到ihe getConfigTreeBuilder 表明正在构建树...
    • 我看到了你的问题。这是因为您尝试直接在捆绑配置中使用app 参数。在app/config/config.yml 中使用它可以与我提供的解决方案一起使用。是因为你想为你的包添加一些默认值吗?在这种情况下,您必须使用 Tree Builder 的功能:symfony.com/doc/current/components/config/…
    • 还有另一个问题——是的,我正在尝试定义与我的捆绑包有关的值。它们不会被覆盖/修改,所以我不会认为它们是“默认的”,因为它们只是我设置的值......这些配置值的目的是保存当前在一堆自定义中的数据我的学说实体属性的注释......即我将所有自定义学说注释移动到配置文件。所以所说的“其他问题”是我是否通过将配置放在包中而不是全局配置文件中采取了正确的方法
    • 我又在想你的问题了。而且我认为你应该为你的包使用默认配置,定义配置树而不是你的包的config.yml 文件。见symfony.com/doc/current/components/config/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 2011-05-12
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多