我需要在bundle的语义配置中定义一个具有给定默认值的数组节点。目前看起来像这样:
$node->arrayNode('foo')
->prototype('scalar')->end()
->defaultValue(array('1', '2', '3'))
->end();
我想让用户选择使用null
覆盖此数组,如:
my_bundle:
foo: ~
我不能使用空数组([]
或array()
)代替null
,因为[]
应该具有与null
不同的语义。
这是可能的还是有任何非丑陋的解决方法?目前我只是得到一个例外:
InvalidTypeException:路径“my_bundle.foo”的类型无效。预期数组,但得到NULL
答案 0 :(得分:18)
您可以尝试以下方式:
$node->arrayNode('foo')
->beforeNormalization()
->ifTrue(function($v) { return $v === null; })
->then(function($v) { return array(); })
->end()
->prototype('scalar')->end()
->defaultValue(array('1', '2', '3'))
->end();
或者更简单:
$node->arrayNode('foo')
->treatNullLike(array())
->prototype('scalar')->end()
->defaultValue(array('1', '2', '3'))
->end();
否则你可以使用variableNode而不是arrayNode;这将为您提供更多自由,但开箱即用的验证/合并逻辑更少。