diff --git a/components/config/definition.rst b/components/config/definition.rst
index c6a26f35469..f77855870f9 100644
--- a/components/config/definition.rst
+++ b/components/config/definition.rst
@@ -211,72 +211,147 @@ Before defining the children of an array node, you can provide options like:
the resulting array. This method also defines the way config array keys are
treated, as explained in the following example.
-When the ``useAttributeAsKey()`` method is not used, the names of the array
-elements (i.e. the array keys) are ignored when parsing the configuration.
-Consider this example::
+A basic prototyped array configuration can be defined as follows::
- $rootNode
+ $node
+ ->fixXmlConfig('driver')
->children()
- ->arrayNode('parameters')
- ->prototype('array')
- ->children()
- ->scalarNode('parameter1')->end()
- ->scalarNode('parameter2')->end()
- ->end()
- ->end()
+ ->arrayNode('drivers')
+ ->prototype('scalar')->end()
->end()
->end()
;
-In YAML, the configuration might look like this:
+When using the following YAML configuration:
.. code-block:: yaml
- database:
- parameters: [ 'value1', 'value2' ]
+ drivers: ['mysql', 'sqlite']
-In XML, the configuration might look like this:
+Or the following XML configuration:
.. code-block:: xml
- ...
+ msyql
+ sqlite
-However, if the ``useAttributeAsKey()`` method is set, the parsed configuration
-will be completely different::
+The processed configuration is::
- $rootNode
+ Array(
+ [0] => 'mysql'
+ [1] => 'sqlite'
+ )
+
+A more complex example would be to define a prototyped array with children:
+
+ $node
+ ->fixXmlConfig('connection')
->children()
- ->arrayNode('parameters')
- ->useAttributeAsKey('value')
+ ->arrayNode('connections')
->prototype('array')
->children()
- ->scalarNode('parameter1')->end()
- ->scalarNode('parameter2')->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:
- parameter1: { value: 'value1' }
- parameter2: { value: 'value2' }
+ connections:
+ - { table: symfony, user: root, password: ~ }
+ - { table: foo, user: root, password: pa$$ }
-In XML, the configuration might look like this:
+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 has a ``value`` attribute (along with
-``value``), which would be removed and used as the key for that element in
-the final array. The ``useAttributeAsKey()`` method 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
---------------------------