13

我需要在包的语义配置中定义一个具有给定默认值的数组节点。这目前看起来像:

$node->arrayNode('foo')
         ->prototype('scalar')->end()
         ->defaultValue(array('1', '2', '3'))
     ->end();

我想给用户一个选项来覆盖这个数组,null比如:

my_bundle:
  foo: ~

我不能使用空数组 ([]array()) 来代替null应该[]具有不同语义的null.

这是可能的还是有任何不难看的解决方法?目前我只是得到一个例外:

InvalidTypeException:路径“my_bundle.foo”的类型无效。预期的数组,但得到 NULL

4

1 回答 1

20

您可以尝试以下方法:

$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;这将为您提供更多自由,但开箱即用的验证/合并逻辑更少。

于 2012-10-31T11:34:14.443 回答