加载我的包时,Symfony容器没有扩展名

时间:2015-03-09 08:03:59

标签: php symfony configuration

我有一个捆绑,一段时间以来运作良好。但是,我不得不为它添加一些自定义配置参数,所以我在bundle的config.yml中写了一些代码,如下所示:

# ...
acme_my_bundle:
    special_params: ['param_1', 'param_2']

配置在包的Configuration类中定义:

namespace ACME\MyBundle\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

/**
 * This is the class that validates and merges configuration from your app/config files
 *
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html#cookbook-bundles-extension-config-class}
 */
class Configuration implements ConfigurationInterface {
    /**
     * {@inheritdoc}
     */
    public function getConfigTreeBuilder() {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('acme_my_bundle');

        $rootNode
            ->children()
                ->arrayNode('special_params')
                ->end()
            ->end();

        return $treeBuilder;
    }
}

捆绑包已在AppKernel.php中正确注册:

public function registerBundles() {
    $bundles = array(
        // ...
        new ACME\MyBundle(),
        // ...
    );

    // ...

    return $bundles;
}

但是,当我尝试使用我的应用时,出现错误:

There is no extension able to load the configuration for "acme_my_bundle" (in (path_to_bundle)/MyBundle/DependencyInjection/../Resources/config/config.yml). Looked for namespace "acme_my_bundle", found none

我查了一下,但发现的大多数结果并不令人满意 - 我消除了搜索过程中出现的问题:

  • 不正确的配置结构
  • 捆绑未在应用内核中注册
  • 配置根节点名称不同于从ACMEMyBundleExtension::getAlias()
  • 返回的名称

我尝试调试抛出异常的原因并发现当YAML文件加载器尝试验证我的配置文件时,容器没有扩展名:

var_dump($container->getExtensions()); // prints empty array - array(0) { }

它会导致验证失败并显示消息的 none 部分 - 没有可用的扩展名。

我尝试在$this->extensions中调试ContainerBuilder::hasExtension(),并且出于某种原因,在为供应商捆绑包启动方法时列表已完成,但对于我的捆绑包是空的。看起来我的包中的某些东西仍然被定义或注册不正确。

我改变了课程名称等等,不公开公司代码,如果引起混淆,请原谅我。

编辑:我没有明确提及它,但Extension类已定义,并且在加载时发生异常 - 正如我上面所写:

  

当YAML文件加载器尝试验证我的配置文件

更清楚的是,这是我的Extension课程:

namespace ACME\MyBundle\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader;

/**
 * This is the class that loads and manages your bundle configuration
 *
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
 */
class ACMEMyBundleExtension extends Extension {
    /**
     * {@inheritdoc}
     */
    public function load(array $configs, ContainerBuilder $container) {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
        // The exception is thrown here
        $loader->load('config.yml');
    }
}

3 个答案:

答案 0 :(得分:2)

ACME\MyBundle\DependencyInjection\Configuration中查看您的配置阅读器$rootNode = $treeBuilder->root('BUNDLE_CONFIG_KEY');

BUNDLE_CONFIG_KEY应该是:

  • 有效(ACME\MyBundle\DependencyInjection\Configurationconfig.yml
  • 相同)
  • 应用程序的唯一

另外请检查您是否以正确的方式定义捆绑配置 - 应将其添加到app/config/*.yml(全局配置文件之一)。也许您已在其他自定义捆绑包配置文件中添加了acme_my_bundle配置?

答案 1 :(得分:1)

您已经错过了捆绑扩展类(ACME \ MyBundle \ DependencyInjection \ ACMEMyExtension),如http://symfony.com/doc/current/cookbook/bundles/extension.html所述。捆绑配置的Cookbook条目为here。 config.yml中的键只能命名为acme_my。

答案 2 :(得分:1)

单独创建Configuration类是不够的。您需要注册依赖注入扩展并在其中使用Configuration类。

How to Create Friendly Configuration for a Bundle食谱中了解更多信息:

  

[Configuration]类现在可以在load()方法中用于合并配置和强制验证(例如,如果传递了其他选项,则会抛出异常)

namespace Acme\MyBundle\DependencyInjection;

use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class AcmeMyBundleExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();

        $config = $this->processConfiguration($configuration, $configs);
        // ...
    }
}

根据约定命名您的扩展程序将自动加载它。有关在Creating an Extension Class中创建DIC扩展类的更多信息。您也可以手动启用扩展程序,请参阅Manually registering an extension class