简而言之,我正在尝试实现以下配置文件结构:
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特定的功能来复制粘贴模板值。