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();

それ以外の場合は、arrayNodeではなくvariableNodeを使用できます。これにより、自由度が増しますが、すぐに使用できる検証/マージロジックが少なくなります。

于 2012-10-31T11:34:14.443 に答える