在Symfony2 bundle配置中使用模板值

时间:2015-10-05 10:44:36

标签: symfony dependency-injection configuration bundle

简而言之,我正在尝试实现以下配置文件结构:

acmebundle:
  connections:
    @template:
      param1: value1
      param2: value2
    conn1:
      extends: @template
      param2: value3

在规范化过程中,我希望任何名称以“@”开头的连接(在本例中为@template)被丢弃并且根本不进行验证。但在此之前,所有其他扩展它的连接应该在验证过程之前填充所有@template值。

这有可能吗?任何提示都将不胜感激。

目前我有这个:

acmebundle:
  connections:
    @template: &template
      abstract: true
      param1: value1
      param2: value2
    conn1:
      <<: *template
      abstract: false
      param2: value3

我解析它是这样的:

private function getConnectionsNode()
{
    $builder = new TreeBuilder();
    $node = $builder->root('connections');

    $node
        ->isRequired()
        ->requiresAtLeastOneElement()
        ->useAttributeAsKey('id')
        ->prototype('array')
        ->beforeNormalization()
            ->ifTrue(function($v) {
                return isset($v['abstract']) && true === $v['abstract'];
            })
            ->then(function($v) {
                // Set dummy params to ensure validation is passed
                if (empty($v['param1'])) {
                    $v['param1'] = 'undefined';
                }
                if (empty($v['param2'])) {
                    $v['param2'] = 'undefined';
                }
                return $v;
            })
        ->end()
            ->children()
                ->booleanNode('abstract')
                    ->defaultFalse()
                ->end()
                ->scalarNode('param1')
                    ->isRequired()
                    ->cannotBeEmpty()
                ->end()
                ->scalarNode('param2')
                    ->isRequired()
                    ->cannotBeEmpty()
                ->end()
            ->end()
        ->end();

    return $node;
}

它有效,但它很难看,因为我必须在每个真实连接上指定abstract:false,并且我必须依赖YML特定的功能来复制粘贴模板值。

0 个答案:

没有答案