验证Symfony2语义配置时出错

时间:2014-06-25 09:19:30

标签: php symfony configuration dependency-injection

我正在尝试在Symfony2中编写捆绑包的语义配置。我使用YAML(spu.yml)编写了一个配置文件:

spu:
    modules:
        spu-module:
            reuqires: []
            path: modules/spu-module.js

然后我将它加载到扩展文件(DependencyInjection / spuExtension.php)中:

namespace Gig\SpuBundle\DependencyInjection;

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


class spuExtension extends Extension
{
    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' ) );
        $loader->load( 'services.yml' );
        $loader->load( 'spu.yml' );
    }
}

此扩展的配置类()DependencyInjection / Configuration.php)是:

namespace Gig\SpuBundle\DependencyInjection;

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

class Configuration implements ConfigurationInterface
{
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root( 'spu' );

        $rootNode
            ->children()
                ->arrayNode('modules')
                    ->isRequired()
                    ->prototype('array')
                ->end()
            ->end();

        return $treeBuilder;
    }
}

验证配置时出错:

  

[Symfony的\元器件\配置\定义\异常\ InvalidConfigurationException]   必须配置路径“spu”中的子节点“modules”。

我做错了什么?

3 个答案:

答案 0 :(得分:1)

您必须将其包含在主app / config / config.yml文件中

imports:
  - { resource: parameters.yml }
  - { resource: security.yml }
  - { resource: spu.yml }

如果要使用默认参数,请在DependencyInjection / Configuration.php中设置它们 这可能是这样的。

$rootNode
    ->children()
        ->arrayNode('modules')
            ->isRequired()
            ->addDefaultsIfNotSet()         
            ->prototype('array')
            ->children()
                ->arrayNode('reuqires')->end()
                ->scalarNode('path')->defaultValue('modules/spu-module.js')->end()
            ->end()
        ->end()
    ->end()
->end();

答案 1 :(得分:0)

执行此操作的最佳方法是让用户在config.yml文件中定义捆绑包的配置。不需要特殊文件。

您可以保留Configuration类中的配置,但必须修改spuExtension类。

Symfony的工作方式你必须在spuExtension类中读取bundle的config.yml中的值,然后将它们设置为参数。然后,您可以使用容器的getParameter方法轻松访问这些值。

这就是你的config.yml看起来的样子

spu:
    modules:
        spu-module:
            reuqires: []
            path: modules/spu-module.js

然后在您的spuExtension类中,您可以通过执行以下操作来获取这些值:

class spuExtension extends Extension
{
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' ) );
    $loader->load( 'services.yml' );

    $container->setParameter('modules', $configs[0]);
}

}

这将使您可以轻松地在控制器中使用容器来获取参数。

spuExtension中的$ configs变量将包含根目录下列出的所有配置。在这种情况下是spu。

Symfony的工作方式首先必须在bundle的扩展类中加载配置,然后将其设置为参数,这似乎是多余的,但这是最佳实践,它的目的是像这样工作。

答案 2 :(得分:0)

好的,我的方式不同。

public function load(array $configs, ContainerBuilder $container)
{
    $loader = new Loader\YamlFileLoader( $container, new FileLocator( __DIR__ . '/../Resources/config' ) );
    $loader->load( 'services.yml' );
    $loader->load( 'spu.yml' );

    $spuConfig  = Yaml::parse(__DIR__ . '/../Resources/config/spu.yml');
    $configs    = array_merge($configs, $spuConfig);

    $configuration = new Configuration();
    $config = $this->processConfiguration( $configuration, $configs );
}

现在我得到了我想要的东西。我可以在Configuration类中验证params。