1
1
Callback
2
2
========
3
3
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
5
10
règles de validation personnalisées et d'assigner des erreurs de validation à
6
11
des champs spécifiques de votre objet. Si vous utilisez la validation de formulaires,
7
12
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.
18
23
possibilité d'ajouter directement des « violations » de validateur.
19
24
20
25
+----------------+------------------------------------------------------------------------+
21
- | S'applique à | :ref: `classe <validation-class-target> ` |
26
+ | S'applique à | :ref: `class <validation-class-target >` |
22
27
+----------------+------------------------------------------------------------------------+
23
- | Options | - ` methods `_ |
28
+ | Options | - :ref: ` callback < callback-option >` |
24
29
+----------------+------------------------------------------------------------------------+
25
30
| Classe | :class: `Symfony\\ Component\\ Validator\\ Constraints\\ Callback ` |
26
31
+----------------+------------------------------------------------------------------------+
@@ -37,31 +42,39 @@ Configuration
37
42
# src/Acme/BlogBundle/Resources/config/validation.yml
38
43
Acme\BlogBundle\Entity\Author :
39
44
constraints :
40
- - Callback :
41
- methods : [isAuthorValid]
45
+ - Callback : [validate]
42
46
43
47
.. code-block :: php-annotations
44
48
45
49
// src/Acme/BlogBundle/Entity/Author.php
50
+ namespace Acme\BlogBundle\Entity;
51
+
46
52
use Symfony\Component\Validator\Constraints as Assert;
53
+ use Symfony\Component\Validator\ExecutionContextInterface;
47
54
48
- /**
49
- * @Assert\Callback(methods={"isAuthorValid"})
50
- */
51
55
class Author
52
56
{
57
+ /**
58
+ * @Assert\Callback
59
+ */
60
+ public function validate(ExecutionContextInterface $context)
61
+ {
62
+ // ...
63
+ }
53
64
}
54
65
55
66
.. code-block :: xml
56
67
57
68
<!-- 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 >
65
78
66
79
.. code-block :: php
67
80
@@ -75,9 +88,7 @@ Configuration
75
88
{
76
89
public static function loadValidatorMetadata(ClassMetadata $metadata)
77
90
{
78
- $metadata->addConstraint(new Assert\Callback(array(
79
- 'methods' => array('isAuthorValid'),
80
- )));
91
+ $metadata->addConstraint(new Assert\Callback('validate'));
81
92
}
82
93
}
83
94
@@ -96,118 +107,178 @@ quel champ ces erreurs seront attribuées ::
96
107
// ...
97
108
private $firstName;
98
109
99
- public function isAuthorValid (ExecutionContextInterface $context)
110
+ public function validate (ExecutionContextInterface $context)
100
111
{
101
- // Vous avez un tableau de « faux noms »
102
- $fakeNames = array();
112
+ // Imaginons que vous avez un tableau de noms bidons
113
+ $fakeNames = array(/* ... */ );
103
114
104
- // vérifie si le nom est un faux
115
+ // Vérifie si le nom est bidon
105
116
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
+ );
107
123
}
108
124
}
109
125
}
110
126
111
- Options
112
- -------
127
+ Callbacks statiques
128
+ -------------------
113
129
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::
116
133
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
+ }
118
149
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
+ ------------------------------
122
152
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() ``::
124
157
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;
128
159
129
- 2) ** Tableau statique **
160
+ use Symfony\Component\Validator\ExecutionContextInterface;
130
161
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
+ }
132
169
133
- .. configuration-block : :
170
+ Vous pouvez alors utiliser la configuration suivante pour invoquer ce validateur :
134
171
135
- .. code -block :: yaml
172
+ .. configuration -block ::
136
173
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
143
175
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]
145
180
146
- // src/Acme/BlogBundle/Entity/Author.php
147
- use Symfony\Component\Validator\Constraints as Assert;
181
+ .. code-block :: php-annotations
148
182
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;
157
185
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" >
159
202
160
- <!-- src/Acme/BlogBundle/Resources/config/validation.xml -->
161
203
<class name =" Acme\BlogBundle\Entity\Author" >
162
204
<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 >
167
207
</constraint >
168
208
</class >
209
+ </constraint-mapping >
169
210
170
- .. code-block :: php
211
+ .. code-block :: php
171
212
172
- // src/Acme/BlogBundle/Entity/Author.php
213
+ // src/Acme/BlogBundle/Entity/Author.php
214
+ namespace Acme\BlogBundle\Entity;
173
215
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 ;
176
218
177
- class Author
219
+ class Author
220
+ {
221
+ public static function loadValidatorMetadata(ClassMetadata $metadata)
178
222
{
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
+ )));
187
227
}
228
+ }
188
229
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::
192
241
193
- namespace Acme\BlogBundle;
242
+ // src/Acme/BlogBundle/Entity/Author.php
243
+ namespace Acme\BlogBundle\Entity;
194
244
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 ;
197
247
198
- class MyStaticValidatorClass
248
+ class Author
249
+ {
250
+ public static function loadValidatorMetadata(ClassMetadata $metadata)
199
251
{
200
- static public function isAuthorValid(Author $author, ExecutionContext $context)
201
- {
252
+ $callback = function ($object, ExecutionContextInterface $context) {
202
253
// ...
203
- }
254
+ };
255
+
256
+ $metadata->addConstraint(new Assert\Callback($callback));
204
257
}
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.
205
278
206
- .. tip ::
279
+ Les callbacks concrètes reçoivent une instance de :class: `Symfony\\ Component\\ Validator\\ ExecutionContextInterface `
280
+ pour seul argument.
207
281
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