Symfony2:没有能够加载配置的扩展

mar*_*arc 2 php configuration exception symfony

我正在构建一个扩展来从所有已安装的bundle加载配置文件.

我的扩展看起来像这样:

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');
    }
}
Run Code Online (Sandbox Code Playgroud)

然后是我的(非常简单的)Configuration类:我将来会添加一个更复杂的树,但是现在我希望它可以使用它:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

为了测试我只在当前的MenuBundle\Resources\config中放置了一个"menu.yml"文件,其中包含以下内容:

# file: src\Acme\MenuBundle\Resource\config\menu.yml
mw_menu: "some teststring"
Run Code Online (Sandbox Code Playgroud)

对于手动测试,我在默认的Controller中使用了一个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
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

根据我目前的理解,Symfony注意到配置文件中的密钥"mw_menu",但无法找到匹配的配置.

我在烹饪书文章中工作:如何公开语义配置?

请注意:我知道Knp Menu Bundle和类似的Bundles,但我想自己实现一个菜单.

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

Mic*_*ick 8

那是因为你的代码:

$rootNode = $treeBuilder->root('mw_menu'); 

$rootNode
    ->children()
    ->scalarNode('mw_menu')->defaultValue('')->end()
    ->end();
Run Code Online (Sandbox Code Playgroud)

意味着配置文件应如下所示:

mw_menu: 
    mw_menu: "some teststring" 
Run Code Online (Sandbox Code Playgroud)

一个例子:

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

$rootNode = $treeBuilder->root('mw_menu'); 

$rootNode
    ->children()
    ->scalarNode('database_driver')->defaultValue('orm')->end()
    ->end();
Run Code Online (Sandbox Code Playgroud)

在配置文件中,这将是这样的:

mw_menu: 
    database_driver: mongo_db
Run Code Online (Sandbox Code Playgroud)