我在Silex框架中使用Symfony Config Component,我需要一个数据数组,其中包含一个版本数组:
some_data:
# some config...
versions:
- 1.1
- 1.2-beta
...
这是配置树生成器的一瞥:
$node = $treeBuilder->root('some_data');
$node
->children()
// some nodes...
->arrayNode('versions')
->addDefaultChildrenIfNoneSet()
->validate()
->ifTrue(function ($v) {
return !empty($v);
})
->then(function ($v) {
$array = array_values(array_unique($v));
sort($array, SORT_NATURAL | SORT_FLAG_CASE);
return $array;
})
->end()
->prototype('scalar')->defaultValue('1')->end()
->end()
->end()
->end()
当没有versions
设置时,我得到了default 1
,好的。但是,当我添加其他一些版本然后尝试删除默认值时1
,它总是在处理配置后返回。
有人知道我在做什么错吗?这是预期的行为吗?
看来这addDefaultChildrenIfNoneSet()
是一种验证,并且在处理配置addDefaultChildrenIfNoneSet()
和->validate()
结果时都将其合并。
为了避免这种行为,只需添加performNoDeepMerging()
到节点:
$node = $treeBuilder->root('some_data');
$node
->children()
// some nodes...
->arrayNode('versions')
->addDefaultChildrenIfNoneSet()
->performNoDeepMerging() // This is the fix
->validate()
->ifTrue(function ($v) {
return !empty($v);
})
->then(function ($v) {
$array = array_values(array_unique($v));
sort($array, SORT_NATURAL | SORT_FLAG_CASE);
return $array;
})
->end()
->prototype('scalar')->defaultValue('1')->end()
->end()
->end()
->end()
参见http://symfony.com/doc/current/components/config/definition.html#optional-sections
另一种方法是:
// add a default value on the array, not on the prototype :
$node
->children()
// some nodes...
->arrayNode('versions')
->validate()
->ifTrue(function ($v) {
return !empty($v);
})
->then(function ($v) {
$array = array_values(array_unique($v));
sort($array, SORT_NATURAL | SORT_FLAG_CASE);
return $array;
})
->end()
->prototype('scalar')->end()
->defaultValue(['1']) // this is a fix
->end()
->end()
->end()
// or just use one validation rule
$node
->children()
// some nodes...
->arrayNode('versions')
->validate()
->always(function ($v) { // another fix
if (empty($v)) {
return ['1'];
}
$array = array_values(array_unique($v));
sort($array, SORT_NATURAL | SORT_FLAG_CASE);
return $array;
})
->end()
->prototype('scalar')->end()
->end()
->end()
->end()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句