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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy