diff --git a/components/config/definition.rst b/components/config/definition.rst index b79ad3853a2..abce20b6a2c 100644 --- a/components/config/definition.rst +++ b/components/config/definition.rst @@ -200,43 +200,158 @@ Array Node Options Before defining the children of an array node, you can provide options like: -``useAttributeAsKey()`` - Provide the name of a child node, whose value should be used as the key in the resulting array. -``requiresAtLeastOneElement()`` - There should be at least one element in the array (works only when ``isRequired()`` is also - called). ``addDefaultsIfNotSet()`` - If any child nodes have default values, use them if explicit values haven't been provided. + If any child nodes have default values, use them if explicit values haven't + been provided. +``requiresAtLeastOneElement()`` + There should be at least one element in the array (works only when + ``isRequired()`` is also called). +``useAttributeAsKey()`` + Provide the name of a child node, whose value should be used as the key in + the resulting array. This method also defines the way config array keys are + treated, as explained in the following example. -An example of this:: +A basic prototyped array configuration can be defined as follows:: - $rootNode + $node + ->fixXmlConfig('driver') ->children() - ->arrayNode('parameters') - ->isRequired() - ->requiresAtLeastOneElement() - ->useAttributeAsKey('name') + ->arrayNode('drivers') + ->prototype('scalar')->end() + ->end() + ->end() + ; + +When using the following YAML configuration: + +.. code-block:: yaml + + drivers: ['mysql', 'sqlite'] + +Or the following XML configuration: + +.. code-block:: xml + + msyql + sqlite + +The processed configuration is:: + + Array( + [0] => 'mysql' + [1] => 'sqlite' + ) + +A more complex example would be to define a prototyped array with children:: + + $node + ->fixXmlConfig('connection') + ->children() + ->arrayNode('connections') ->prototype('array') ->children() - ->scalarNode('value')->isRequired()->end() + ->scalarNode('table')->end() + ->scalarNode('user')->end() + ->scalarNode('password')->end() ->end() ->end() ->end() ->end() ; -In YAML, the configuration might look like this: +When using the following YAML configuration: .. code-block:: yaml - database: - parameters: - param1: { value: param1val } + connections: + - { table: symfony, user: root, password: ~ } + - { table: foo, user: root, password: pa$$ } + +Or the following XML configuration: + +.. code-block:: xml + + + + +The processed configuration is:: + + Array( + [0] => Array( + [table] => 'symfony' + [user] => 'root' + [password] => null + ) + [1] => Array( + [table] => 'foo' + [user] => 'root' + [password] => 'pa$$' + ) + ) + +The previous output matches the expected result. However, given the configuration +tree, when using the following YAML configuration: + +.. code-block:: yaml + + connections: + sf_connection: + table: symfony + user: root + password: ~ + default: + table: foo + user: root + password: pa$$ + +The output configuration will be exactly the same as before. In other words, the +``sf_connection`` and ``default`` configuration keys are lost. The reason is that +the Symfony Config component treats arrays as lists by default. + +In order to maintain the array keys use the ``useAttributeAsKey()`` method:: + + $node + ->fixXmlConfig('connection') + ->children() + ->arrayNode('connections') + ->prototype('array') + ->useAttributeAsKey('name') + ->children() + ->scalarNode('table')->end() + ->scalarNode('user')->end() + ->scalarNode('password')->end() + ->end() + ->end() + ->end() + ->end() + ; + +The argument of this method (``name`` in the example above) defines the name of +the attribute added to each XML node to differentiate them. Now you can use the +same YAML configuration showed before or the following XML configuration: + +.. code-block:: xml -In XML, each ``parameters`` node would have a ``name`` attribute (along with -``value``), which would be removed and used as the key for that element in -the final array. The ``useAttributeAsKey`` is useful for normalizing how -arrays are specified between different formats like XML and YAML. + + + +In both cases, the processed configuration maintains the ``sf_connection`` and +``default`` keys:: + + Array( + [sf_connection] => Array( + [table] => 'symfony' + [user] => 'root' + [password] => null + ) + [default] => Array( + [table] => 'foo' + [user] => 'root' + [password] => 'pa$$' + ) + ) Default and required Values ---------------------------