Skip to content

Commit 622b149

Browse files
committed
Merge branch '2.7' into 2.8
* 2.7: Minor tweaks Final changes Reworded the introduction and other minor fixes Added a note about the advantages/drawbacks of listeners/subscribers Fixed minor issues Reworded the subscriber introduction Fixed the name of the services file Implemented the suggestions made by @xabbuh Completed the cookbook about the event subscriber Added a note about the priority meaning in event subscribers Fixed a minor syntax issue Rewritten the explanation about the useAttributeAsKey() method Documented the useAttributeAsKey() method
2 parents b03367c + 2e8d0b7 commit 622b149

File tree

2 files changed

+298
-56
lines changed

2 files changed

+298
-56
lines changed

components/config/definition.rst

Lines changed: 130 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -196,44 +196,157 @@ Array Node Options
196196
Before defining the children of an array node, you can provide options like:
197197

198198
``useAttributeAsKey()``
199-
Provide the name of a child node, whose value should be used as the
200-
key in the resulting array.
199+
Provide the name of a child node, whose value should be used as the key in
200+
the resulting array. This method also defines the way config array keys are
201+
treated, as explained in the following example.
201202
``requiresAtLeastOneElement()``
202203
There should be at least one element in the array (works only when
203204
``isRequired()`` is also called).
204205
``addDefaultsIfNotSet()``
205206
If any child nodes have default values, use them if explicit values
206207
haven't been provided.
207208

208-
An example of this::
209+
A basic prototyped array configuration can be defined as follows::
209210

210-
$rootNode
211+
$node
212+
->fixXmlConfig('driver')
211213
->children()
212-
->arrayNode('parameters')
213-
->isRequired()
214-
->requiresAtLeastOneElement()
215-
->useAttributeAsKey('name')
214+
->arrayNode('drivers')
215+
->prototype('scalar')->end()
216+
->end()
217+
->end()
218+
;
219+
220+
When using the following YAML configuration:
221+
222+
.. code-block:: yaml
223+
224+
drivers: ['mysql', 'sqlite']
225+
226+
Or the following XML configuration:
227+
228+
.. code-block:: xml
229+
230+
<driver>msyql</driver>
231+
<driver>sqlite</driver>
232+
233+
The processed configuration is::
234+
235+
Array(
236+
[0] => 'mysql'
237+
[1] => 'sqlite'
238+
)
239+
240+
A more complex example would be to define a prototyped array with children::
241+
242+
$node
243+
->fixXmlConfig('connection')
244+
->children()
245+
->arrayNode('connections')
216246
->prototype('array')
217247
->children()
218-
->scalarNode('value')->isRequired()->end()
248+
->scalarNode('table')->end()
249+
->scalarNode('user')->end()
250+
->scalarNode('password')->end()
219251
->end()
220252
->end()
221253
->end()
222254
->end()
223255
;
224256

225-
In YAML, the configuration might look like this:
257+
When using the following YAML configuration:
226258

227259
.. code-block:: yaml
228260
229-
database:
230-
parameters:
231-
param1: { value: param1val }
261+
connections:
262+
- { table: symfony, user: root, password: ~ }
263+
- { table: foo, user: root, password: pa$$ }
264+
265+
Or the following XML configuration:
266+
267+
.. code-block:: xml
268+
269+
<connection table="symfony" user="root" password="null" />
270+
<connection table="foo" user="root" password="pa$$" />
271+
272+
The processed configuration is::
273+
274+
Array(
275+
[0] => Array(
276+
[table] => 'symfony'
277+
[user] => 'root'
278+
[password] => null
279+
)
280+
[1] => Array(
281+
[table] => 'foo'
282+
[user] => 'root'
283+
[password] => 'pa$$'
284+
)
285+
)
286+
287+
The previous output matches the expected result. However, given the configuration
288+
tree, when using the following YAML configuration:
289+
290+
.. code-block:: yaml
291+
292+
connections:
293+
sf_connection:
294+
table: symfony
295+
user: root
296+
password: ~
297+
default:
298+
table: foo
299+
user: root
300+
password: pa$$
301+
302+
The output configuration will be exactly the same as before. In other words, the
303+
``sf_connection`` and ``default`` configuration keys are lost. The reason is that
304+
the Symfony Config component treats arrays as lists by default.
305+
306+
In order to maintain the array keys use the ``useAttributeAsKey()`` method::
307+
308+
$node
309+
->fixXmlConfig('connection')
310+
->children()
311+
->arrayNode('connections')
312+
->prototype('array')
313+
->useAttributeAsKey('name')
314+
->children()
315+
->scalarNode('table')->end()
316+
->scalarNode('user')->end()
317+
->scalarNode('password')->end()
318+
->end()
319+
->end()
320+
->end()
321+
->end()
322+
;
323+
324+
The argument of this method (``name`` in the example above) defines the name of
325+
the attribute added to each XML node to differentiate them. Now you can use the
326+
same YAML configuration showed before or the following XML configuration:
327+
328+
.. code-block:: xml
232329
233-
In XML, each ``parameters`` node would have a ``name`` attribute (along
234-
with ``value``), which would be removed and used as the key for that element
235-
in the final array. The ``useAttributeAsKey`` is useful for normalizing
236-
how arrays are specified between different formats like XML and YAML.
330+
<connection name="sf_connection"
331+
table="symfony" user="root" password="null" />
332+
<connection name="default"
333+
table="foo" user="root" password="pa$$" />
334+
335+
In both cases, the processed configuration maintains the ``sf_connection`` and
336+
``default`` keys::
337+
338+
Array(
339+
[sf_connection] => Array(
340+
[table] => 'symfony'
341+
[user] => 'root'
342+
[password] => null
343+
)
344+
[default] => Array(
345+
[table] => 'foo'
346+
[user] => 'root'
347+
[password] => 'pa$$'
348+
)
349+
)
237350

238351
Default and Required Values
239352
---------------------------

0 commit comments

Comments
 (0)