Symfony2配置根节点未被识别。

3
我将尝试定义我的捆绑包用户可用的配置参数,但是我遇到了一个问题:无法识别根节点。
我创建了一个名为“Configuration”的类,并编写了一个名为“getConfigTreeBuilder”的函数,代码如下:
/**
 * {@inheritdoc}
 */
public function getConfigTreeBuilder()
{
    $treeBuilder = new TreeBuilder();
    $rootNode = $treeBuilder->root('rally_stats');

    // Here you should define the parameters that are allowed to
    // configure your bundle. See the documentation linked above for
    // more information on that topic.

    $rootNode->children()->arrayNode('projects')
        ->prototype('scalar')->end();

    return $treeBuilder;
}

使用这个,我希望能够在config.yml中创建一个类似于以下的部分:

rally_stats:
    projects:
        - project1
        - project2

然后可以使用以下方式访问配置:

$this->getContainer()->getParameter('rally_stats.projects');

然而,当试图加载该配置时,出现了以下错误:
[Symfony\Component\Config\Exception\FileLoaderLoadException]
There is no extension able to load the configuration for "rally_stats" 
(in /Users/stu/Projects/rally-stats/app/config/config.yml). Looked for namespace "rally_stats", found "framework", "security", "
twig", "monolog", "swiftmailer", "assetic", "doctrine", "sensio_framework_extra", 
"wa_ndisco_rally_stats", "jms_di_extra", "jms_aop", "debug", "web_profiler", "sensio_distribution" 
in /Users/stu/Projects/rally-stats/app/config/config.yml 
(which is being imported from "/Users/stu/Projects/rally-stats/app/config/config_dev.yml").

最接近的是 wa_ndisco_rally_stats,这是 Symfony 生成捆绑包时的原始根名称。我已经搜索了这个和 wa_ndisco,但没有其他引用。
如果我删除我的捆绑包的配置部分和 dump-reference,我会得到这个:
# Default configuration for "WANdiscoRallyStatsBundle"
rally_stats:
    projects:             []

为什么我不能使用我提供的节点名称添加配置?

如果我确实给它了它认为应该有的名称wa_ndisco_rally_stats,我也无法访问它,对于这个名称我得到了相同的错误。


1
你清除了缓存吗?你确定正在编辑正确的bundle文件吗?你确保有一个RallyStatsBundle而不是一个WaNDiscoRallyStats bundle吗? - Cerad
是的,缓存已清除(手动清除,cache:clear 失败并显示相同错误),我正在编辑 WANdisco\RallyStatsBundle\DependencyInjection 命名空间中的 Configuration 类,您可以从那里看到 bundle 名称... - Stuart Grimshaw
你的 DI 扩展类是否覆盖了 getAlias() 方法? - Cerad
不,只需 load()。感谢您的建议... - Stuart Grimshaw
1
我已经决定,为了在配置中获得不同的名称而进行的操作比它所值得的麻烦得多。一旦你覆盖了getAlias()方法,你还需要开始处理其他方法。我将坚持使用默认名称。感谢您的帮助。 - Stuart Grimshaw
你不应该改动getAlias函数。似乎在某个地方有一些多余的代码。我猜可能是停留在上世纪七十年代的写法。你的应用程序是否在公共git存储库中?我很乐意看看它。这有点神秘。 - Cerad
1个回答

2
首先,您的配置有误:
$rootNode->children()->arrayNode('projects')
    ->prototype('scalar')->end();

应该是:

$rootNode
    ->children()
        ->arrayNode('projects')
            ->prototype('scalar')->end()
        ->end()
    ->end();

如果您想从参数访问它,您需要进入您的bundle扩展类并像这样设置它:

    $container->setParameter('rally_stats.projects', $config['projects']);

在这里,您可以阅读有关此事的一些内容。这里是相关技术的详细介绍。请注意,本文中保留了HTML标签。

我有什么遗漏,还是文档中没有提到调用 setParameter() 的最后一部分? - Stuart Grimshaw
这里是关于参数的一些内容,应该足够了:http://symfony.com/doc/current/components/dependency_injection/parameters.html - vardius
我知道如何获取和设置参数,我的意思更多的是,在为包创建友好配置的文档中,并没有提到您必须在将其规范化之后进行设置。 - Stuart Grimshaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接