Skip to content

Commit a9c1570

Browse files
author
Grégory Quatannens
committed
Merge remote-tracking branch 'origin/2.4' into 2.4
2 parents 19cf67d + 46e99f1 commit a9c1570

File tree

1 file changed

+163
-92
lines changed

1 file changed

+163
-92
lines changed

reference/constraints/Callback.rst

Lines changed: 163 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
Callback
22
========
33

4-
Le but de l'assertion Callback est de vous permettre de créer entièrement des
4+
.. versionadded:: 2.4
5+
L'assertion ``Callback`` a été simplifiée dans Symfony 2.4. Pour des exemples
6+
d'utilisation avec des versions antérieures de Symfony, lisez les versions
7+
correspondantes de cette page.
8+
9+
Le but de la contrainte Callback est de vous permettre de créer entièrement des
510
règles de validation personnalisées et d'assigner des erreurs de validation à
611
des champs spécifiques de votre objet. Si vous utilisez la validation de formulaires,
712
cela signifie que vous pouvez faire en sorte que ces erreurs personnalisées s'affichent
@@ -18,9 +23,9 @@ sorte de choses, incluant la création et l'assignation d'erreurs de validation.
1823
possibilité d'ajouter directement des « violations » de validateur.
1924

2025
+----------------+------------------------------------------------------------------------+
21-
| S'applique à | :ref:`classe<validation-class-target>` |
26+
| S'applique à | :ref:`class <validation-class-target>` |
2227
+----------------+------------------------------------------------------------------------+
23-
| Options | - `methods`_ |
28+
| Options | - :ref:`callback <callback-option>` |
2429
+----------------+------------------------------------------------------------------------+
2530
| Classe | :class:`Symfony\\Component\\Validator\\Constraints\\Callback` |
2631
+----------------+------------------------------------------------------------------------+
@@ -37,31 +42,39 @@ Configuration
3742
# src/Acme/BlogBundle/Resources/config/validation.yml
3843
Acme\BlogBundle\Entity\Author:
3944
constraints:
40-
- Callback:
41-
methods: [isAuthorValid]
45+
- Callback: [validate]
4246
4347
.. code-block:: php-annotations
4448
4549
// src/Acme/BlogBundle/Entity/Author.php
50+
namespace Acme\BlogBundle\Entity;
51+
4652
use Symfony\Component\Validator\Constraints as Assert;
53+
use Symfony\Component\Validator\ExecutionContextInterface;
4754
48-
/**
49-
* @Assert\Callback(methods={"isAuthorValid"})
50-
*/
5155
class Author
5256
{
57+
/**
58+
* @Assert\Callback
59+
*/
60+
public function validate(ExecutionContextInterface $context)
61+
{
62+
// ...
63+
}
5364
}
5465
5566
.. code-block:: xml
5667
5768
<!-- src/Acme/BlogBundle/Resources/config/validation.xml -->
58-
<class name="Acme\BlogBundle\Entity\Author">
59-
<constraint name="Callback">
60-
<option name="methods">
61-
<value>isAuthorValid</value>
62-
</option>
63-
</constraint>
64-
</class>
69+
<?xml version="1.0" encoding="UTF-8" ?>
70+
<constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"
71+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
72+
xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping http://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">
73+
74+
<class name="Acme\BlogBundle\Entity\Author">
75+
<constraint name="Callback">validate</constraint>
76+
</class>
77+
</constraint-mapping>
6578
6679
.. code-block:: php
6780
@@ -75,9 +88,7 @@ Configuration
7588
{
7689
public static function loadValidatorMetadata(ClassMetadata $metadata)
7790
{
78-
$metadata->addConstraint(new Assert\Callback(array(
79-
'methods' => array('isAuthorValid'),
80-
)));
91+
$metadata->addConstraint(new Assert\Callback('validate'));
8192
}
8293
}
8394
@@ -96,118 +107,178 @@ quel champ ces erreurs seront attribuées ::
96107
// ...
97108
private $firstName;
98109

99-
public function isAuthorValid(ExecutionContextInterface $context)
110+
public function validate(ExecutionContextInterface $context)
100111
{
101-
// Vous avez un tableau de « faux noms »
102-
$fakeNames = array();
112+
// Imaginons que vous avez un tableau de noms bidons
113+
$fakeNames = array(/* ... */);
103114

104-
// vérifie si le nom est un faux
115+
// Vérifie si le nom est bidon
105116
if (in_array($this->getFirstName(), $fakeNames)) {
106-
$context->addViolationAt('firstname', 'This name sounds totally fake!', array(), null);
117+
$context->addViolationAt(
118+
'firstName',
119+
'Ce nom me semble complètement bidon !',
120+
array(),
121+
null
122+
);
107123
}
108124
}
109125
}
110126

111-
Options
112-
-------
127+
Callbacks statiques
128+
-------------------
113129

114-
methods
115-
~~~~~~~
130+
Vous pouvez aussi utiliser cette contrainte avec des méthodes statiques.
131+
Étant donné que les méthodes statiques n'ont pas accès à l'instance de l'objet,
132+
elles reçoivent l'objet en premier argument::
116133

117-
**type**: ``array`` **default**: ``array()`` [:ref:`option par défaut<validation-default-option>`]
134+
public static function validate($object, ExecutionContextInterface $context)
135+
{
136+
// Imaginons que vous avez un tableau de noms bidons
137+
$fakeNames = array(/* ... */);
138+
139+
// Vérifie si le nom est bidon
140+
if (in_array($object->getFirstName(), $fakeNames)) {
141+
$context->addViolationAt(
142+
'firstName',
143+
'Ce nom me semble complètement bidon !',
144+
array(),
145+
null
146+
);
147+
}
148+
}
118149

119-
Il s'agit d'un tableau de méthodes qui doivent être exécutées durant le
120-
processus de validation. Chacune de ces méthodes peut avoir l'un des formats
121-
suivants :
150+
Callbacks externes et closures
151+
------------------------------
122152

123-
1) **Nom de la méthode sous forme de chaîne de caractères**
153+
Si vous voulez exécuter une callback statique qui ne se trouve pas dans la classe
154+
de l'objet validé, vous pouvez configurer la contrainte pour qu'elle utilise un
155+
tableau de type callable tel que supporté par la fonction PHP :phpfunction:`call_user_func`.
156+
Supposez que votre fonction de validation est ``Vendor\Package\Validator::validate()``::
124157

125-
Si le nom de la méthode est une simple chaîne de caractères (par exemple : ``isAuthorValid``),
126-
cette méthode sera appelée sur le même objet que celui qui est en train d'être validé
127-
et ``ExecutionContext`` sera le seul argument (voyez l'exemple ci-dessus).
158+
namespace Vendor\Package;
128159

129-
2) **Tableau statique**
160+
use Symfony\Component\Validator\ExecutionContextInterface;
130161

131-
Chaque méthode peut également être spécifiée sous forme de tableau standard :
162+
class Validator
163+
{
164+
public static function validate($object, ExecutionContextInterface $context)
165+
{
166+
// ...
167+
}
168+
}
132169

133-
.. configuration-block::
170+
Vous pouvez alors utiliser la configuration suivante pour invoquer ce validateur :
134171

135-
.. code-block:: yaml
172+
.. configuration-block::
136173

137-
# src/Acme/BlogBundle/Resources/config/validation.yml
138-
Acme\BlogBundle\Entity\Author:
139-
constraints:
140-
- Callback:
141-
methods:
142-
- [Acme\BlogBundle\MyStaticValidatorClass, isAuthorValid]
174+
.. code-block:: yaml
143175
144-
.. code-block:: php-annotations
176+
# src/Acme/BlogBundle/Resources/config/validation.yml
177+
Acme\BlogBundle\Entity\Author:
178+
constraints:
179+
- Callback: [Vendor\Package\Validator, validate]
145180
146-
// src/Acme/BlogBundle/Entity/Author.php
147-
use Symfony\Component\Validator\Constraints as Assert;
181+
.. code-block:: php-annotations
148182
149-
/**
150-
* @Assert\Callback(methods={
151-
* { "Acme\BlogBundle\MyStaticValidatorClass", "isAuthorValid"}
152-
* })
153-
*/
154-
class Author
155-
{
156-
}
183+
// src/Acme/BlogBundle/Entity/Author.php
184+
namespace Acme\BlogBundle\Entity;
157185
158-
.. code-block:: xml
186+
use Symfony\Component\Validator\Constraints as Assert;
187+
188+
/**
189+
* @Assert\Callback({"Vendor\Package\Validator", "validate"})
190+
*/
191+
class Author
192+
{
193+
}
194+
195+
.. code-block:: xml
196+
197+
<!-- src/Acme/BlogBundle/Resources/config/validation.xml -->
198+
<?xml version="1.0" encoding="UTF-8" ?>
199+
<constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"
200+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
201+
xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping http://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">
159202
160-
<!-- src/Acme/BlogBundle/Resources/config/validation.xml -->
161203
<class name="Acme\BlogBundle\Entity\Author">
162204
<constraint name="Callback">
163-
<option name="methods">
164-
<value>Acme\BlogBundle\MyStaticValidatorClass</value>
165-
<value>isAuthorValid</value>
166-
</option>
205+
<value>Vendor\Package\Validator</value>
206+
<value>validate</value>
167207
</constraint>
168208
</class>
209+
</constraint-mapping>
169210
170-
.. code-block:: php
211+
.. code-block:: php
171212
172-
// src/Acme/BlogBundle/Entity/Author.php
213+
// src/Acme/BlogBundle/Entity/Author.php
214+
namespace Acme\BlogBundle\Entity;
173215
174-
use Symfony\Component\Validator\Mapping\ClassMetadata;
175-
use Symfony\Component\Validator\Constraints\Callback;
216+
use Symfony\Component\Validator\Mapping\ClassMetadata;
217+
use Symfony\Component\Validator\Constraints as Assert;
176218
177-
class Author
219+
class Author
220+
{
221+
public static function loadValidatorMetadata(ClassMetadata $metadata)
178222
{
179-
public $name;
180-
181-
public static function loadValidatorMetadata(ClassMetadata $metadata)
182-
{
183-
$metadata->addConstraint(new Callback(array(
184-
'methods' => array('isAuthorValid'),
185-
)));
186-
}
223+
$metadata->addConstraint(new Assert\Callback(array(
224+
'Vendor\Package\Validator',
225+
'validate',
226+
)));
187227
}
228+
}
188229
189-
Dans ce cas, la méthode statique ``isAuthorValid`` sera appelée sur la classe
190-
``Acme\BlogBundle\MyStaticValidatorClass``. Deux objets sont passés en paramètre,
191-
l'objet en cours de validation (par exemple : ``Author``) et le ``ExecutionContext``::
230+
.. note::
231+
232+
La contrainte Callback ne supporte *pas* les fonctions de callback globales
233+
et il n'est pas possible de spécifier une fonction globale ou une méthode
234+
de :term:`service` en tant que callback. Pour valider en utilisant un service
235+
vous devez :doc:`créer une contrainte de validation personnalisée
236+
</cookbook/validation/custom_constraint>` et ajouter cette contrainte à votre
237+
classe.
238+
239+
Quand vous configurez la contrainte en PHP, vous pouvez aussi passer une closure
240+
au constructeur de la contrainte Callback::
192241

193-
namespace Acme\BlogBundle;
242+
// src/Acme/BlogBundle/Entity/Author.php
243+
namespace Acme\BlogBundle\Entity;
194244

195-
use Symfony\Component\Validator\ExecutionContext;
196-
use Acme\BlogBundle\Entity\Author;
245+
use Symfony\Component\Validator\Mapping\ClassMetadata;
246+
use Symfony\Component\Validator\Constraints as Assert;
197247

198-
class MyStaticValidatorClass
248+
class Author
249+
{
250+
public static function loadValidatorMetadata(ClassMetadata $metadata)
199251
{
200-
static public function isAuthorValid(Author $author, ExecutionContext $context)
201-
{
252+
$callback = function ($object, ExecutionContextInterface $context) {
202253
// ...
203-
}
254+
};
255+
256+
$metadata->addConstraint(new Assert\Callback($callback));
204257
}
258+
}
259+
260+
Options
261+
-------
262+
263+
.. _callback-option:
264+
265+
callback
266+
~~~~~~~~
267+
268+
**type**: ``string``, ``array`` ou ``Closure`` [:ref:`default option <validation-default-option>`]
269+
270+
L'option callback accepte trois formats différents pour spécifier la méthode
271+
de callback :
272+
273+
* Une **chaîne de caractères** contenant le nom d'une méthode concrète ou statique;
274+
275+
* Un tableau de type callable au format ``array('<Class>', '<method>')``;
276+
277+
* Une closure.
205278

206-
.. tip::
279+
Les callbacks concrètes reçoivent une instance de :class:`Symfony\\Component\\Validator\\ExecutionContextInterface`
280+
pour seul argument.
207281

208-
Si vous spécifiez votre contrainte ``Callback`` via PHP, alors vous avez
209-
également le choix de faire votre callback en closure PHP, ou en non-statique.
210-
Il n'est, en revanche, *pas* possible de spécifier un :term:`service` comme
211-
contrainte. Pour faire de la validation en utilisant un service, vous devriez
212-
:doc:`créer une contrainte de validation personnalisée</cookbook/validation/custom_constraint>`
213-
et ajouter cette nouvelle contrainte à votre classe.
282+
Les callbacks statiques ou de type closure reçoivent l'objet validé en premier
283+
argument, et l'instance de :class:`Symfony\\Component\\Validator\\ExecutionContextInterface`
284+
en second argument.

0 commit comments

Comments
 (0)