我正在尝试在一个包中加载一个自定义的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”,找不到
答案 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;
}
}
}