Table of Contents
Questions & Feedback
Found a typo or an error?
Want to improve this document? Edit it.
Need support or have a technical question?
Post to the user mailing-list.
Master Symfony2 fundamentals
Symfony hosting done right
Discover the SensioLabs Support
Callback
Callback¶
Lo scopo del vincolo Callback è di poter creare delle regole di validazione completamente personalizzate e di assegnare qualsiasi errore di validazione a campi specifici del proprio oggetto. Se si usa la validazione con i form, questo vuol dire che si possono mostrare questi errori personalizzati accanto a campi specifici, invece di mostrarli semplicemente in cima al form.
Questo processo funziona specificando uno o più metodi di callback, ciascuno dei quali sarà richiamato durante il processo di validazione. Ognuno di questi metodi può fare qualsiasi cosa, incluso creare e assegnare errori di validazione.
Note
Un metodo callback per sé stesso non fallisce, né restituisce valori. Invece, come vedremo nell'esempio, un metodo callback ha l'abilità di aggiungere direttamente "violazioni" al validatore.
| Si applica a | classi |
| Opzioni | |
| Classe | Callback |
| Validatore | CallbackValidator |
Preparazione¶
- YAML
1 2 3 4 5
# src/Acme/BlogBundle/Resources/config/validation.yml Acme\BlogBundle\Entity\Author: constraints: - Callback: methods: [isAuthorValid]
- Annotations
1 2 3 4 5 6 7 8 9 10 11
// src/Acme/BlogBundle/Entity/Author.php namespace Acme\BlogBundle\Entity; use Symfony\Component\Validator\Constraints as Assert; /** * @Assert\Callback(methods={"isAuthorValid"}) */ class Author { }
- XML
1 2 3 4 5 6 7 8
<!-- src/Acme/BlogBundle/Resources/config/validation.xml --> <class name="Acme\BlogBundle\Entity\Author"> <constraint name="Callback"> <option name="methods"> <value>isAuthorValid</value> </option> </constraint> </class>
- PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// src/Acme/BlogBundle/Entity/Author.php namespace Acme\BlogBundle\Entity; use Symfony\Component\Validator\Mapping\ClassMetadata; use Symfony\Component\Validator\Constraints as Assert; class Author { public static function loadValidatorMetadata(ClassMetadata $metadata) { $metadata->addConstraint(new Assert\Callback(array( 'methods' => array('isAuthorValid'), ))); } }
Il metod callback¶
Il metod callback è passato a uno speciale oggetto ExecutionContext. Si possono
impostare le "violazioni" direttamente su questo oggetto e determinare a quale campo
questi errori vadano attribuiti:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // ...
use Symfony\Component\Validator\ExecutionContext;
class Author
{
// ...
private $firstName;
public function isAuthorValid(ExecutionContext $context)
{
// si ha in qualche modo un array di nomi fasulli
$fakeNames = array();
// verifica se il nome è in effetti un nome fasullo
if (in_array($this->getFirstName(), $fakeNames)) {
$context->addViolationAtSubPath('firstname', 'Questo nome sembra proprio falso!', array(), null);
}
}
}
|
Opzioni¶
methods¶
tipo: array predefinito: array() [opzione predefinita]
Un array di metodi che andrebbero eseguiti durante il processo di validazione. Ogni metodo può avere uno dei seguenti formati:
Stringa con il nome del metodo
Se il nome di un metodo è una semplice stringa (p.e.
isAuthorValid), quel metodo sarà richiamato sullo stesso oggetto in corso di validazione eExecutionContextsarà l'unico parametro (vedere esempio precedente).Array statico callback
Ogni metodo può anche essere specificato con un array callback:
- YAML
1 2 3 4 5 6
# src/Acme/BlogBundle/Resources/config/validation.yml Acme\BlogBundle\Entity\Author: constraints: - Callback: methods: - [Acme\BlogBundle\MyStaticValidatorClass, isAuthorValid]
- Annotations
1 2 3 4 5 6 7 8 9 10 11
// src/Acme/BlogBundle/Entity/Author.php use Symfony\Component\Validator\Constraints as Assert; /** * @Assert\Callback(methods={ * { "Acme\BlogBundle\MyStaticValidatorClass", "isAuthorValid"} * }) */ class Author { }
- XML
1 2 3 4 5 6 7 8 9
<!-- src/Acme/BlogBundle/Resources/config/validation.xml --> <class name="Acme\BlogBundle\Entity\Author"> <constraint name="Callback"> <option name="methods"> <value>Acme\BlogBundle\MyStaticValidatorClass</value> <value>isAuthorValid</value> </option> </constraint> </class>
- PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// src/Acme/BlogBundle/Entity/Author.php use Symfony\Component\Validator\Mapping\ClassMetadata; use Symfony\Component\Validator\Constraints\Callback; class Author { public $name; public static function loadValidatorMetadata(ClassMetadata $metadata) { $metadata->addConstraint(new Callback(array( 'methods' => array('isAuthorValid'), ))); } }
In questo caso, sarà richiamato il metodo statico
isAuthorValiddella classeAcme\BlogBundle\MyStaticValidatorClass. Gli verrà passato sia l'oggetto originale in corso di validazione (p.e.Author) cheExecutionContext:1 2 3 4 5 6 7 8 9 10 11 12
namespace Acme\BlogBundle; use Symfony\Component\Validator\ExecutionContext; use Acme\BlogBundle\Entity\Author; class MyStaticValidatorClass { public static function isAuthorValid(Author $author, ExecutionContext $context) { // ... } }
Tip
Se si specifica il vincolo
Callbacktramite PHP, c'è anche l'opzione di rendere il callback una closure PHP o un callback non statico. Tuttavia, non è attualmente possibile specificare un servizio come vincolo. Per validare usando un servizio, si dovrebbe creare un vincolo personalizzato e aggiungere il nuovo vincolo alla propria classe.- YAML





is a trademark of Fabien Potencier. All rights reserved.