Symfony2:没有可以加载配置的扩展


Symfony2: There is no extension able to load the configuration for

我正在构建一个扩展,从所有已安装的包中加载配置文件。

my Extension看起来像这样:

namespace Acme'MenuBundle'DependencyInjection;
// use ...
use Acme'MenuBundle'DependencyInjection'Configuration;
class AcmeMenuExtension extends Extension {
    public function load(array $configs, ContainerBuilder $container) {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);
        $finder = new 'Symfony'Component'Finder'Finder();
        $finder
            ->directories()
            ->in($container->getParameter('kernel.root_dir') . '/../src/*/*Bundle/Resources')
            ->path('config');
        $possibleLocations = array();
        foreach ($finder as $c_dir) {
            $possibleLocations[] = $c_dir->getPathName();
        }
         
        $loader = new Loader'YamlFileLoader($container, new FileLocator($possibleLocations));
        $loader->load('menu.yml');
    }
}

然后是我的(非常简单的)配置类:我将在将来添加一个更复杂的树,但现在我希望它与这个一起工作:

namespace Acme'MenuBundle'DependencyInjection;
// use ...
class Configuration implements ConfigurationInterface {  
    public function getConfigTreeBuilder() {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('mw_menu'); 
        $rootNode
            ->children()
                ->scalarNode('mw_menu')->defaultValue('')->end()
            ->end(); 
        return $treeBuilder;
    }
}

为了测试,我只放置了一个"menu. myl "在当前MenuBundle'Resources'config中的文件中添加以下内容:

# file: src'Acme'MenuBundle'Resource'config'menu.yml
mw_menu: "some teststring"

对于手动测试,我在默认控制器中使用testAction,它实际上什么也不做,只是呈现一个空模板。

无论如何,我得到这个错误:

InvalidArgumentException: There is no extension able to load the configuration for     
"mw_menu" (in {path to symfony}/app/../src/Acme/MenuBundle/Resources'config'menu.yml).
Looked for namespace "mw_menu", found none

我怎么能解决这个问题?

根据我目前的理解,Symfony注意到配置文件中的关键'mw_menu',但无法找到匹配的配置。

我阅读了cookbook文章:如何公开语义配置?

请注意:我知道Knp菜单束和类似的束,但我想实现一个菜单自己。

另外,我发现了这个通知。他是对的吗?

这是因为你的代码:

$rootNode = $treeBuilder->root('mw_menu'); 
$rootNode
    ->children()
    ->scalarNode('mw_menu')->defaultValue('')->end()
    ->end();

表示配置文件应该是这样的:

mw_menu: 
    mw_menu: "some teststring" 

一个例子:

更具体地说,您需要使代码适应您想要的任何节点。通常,人们使用一般根,如mw_menu,然后在以下示例中使用次要值,如database_driver:

$rootNode = $treeBuilder->root('mw_menu'); 
$rootNode
    ->children()
    ->scalarNode('database_driver')->defaultValue('orm')->end()
    ->end();

在配置文件中看起来像这样:

mw_menu: 
    database_driver: mongo_db