Symfony2 - 为什么Symonfy无法加载我的YAML配置

时间:2016-05-24 03:11:05

标签: php symfony-2.8

我正在尝试在一个包中加载一个自定义的YAML配置文件,这出错了,说:

  

没有可以加载配置的扩展程序

我已经解决了我的问题a dumbed down code sample,它有3个简单的文件:

自定义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”,找不到

1 个答案:

答案 0 :(得分:1)

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

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

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

考虑您的捆绑名称空间,app别名将是默认名称。

您可以更改此代码:

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

进入这个:

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

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

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

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

您的应用中可能只有一个捆绑包,称为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;
        }
    }
}