El propósito de la aserción Callback es permitirte crear reglas de validación completamente personalizadas y asignar errores de validación a campos específicos de tu objeto. Si estás utilizando la validación con formularios, esto significa que puedes hacer que estos errores personalizados se muestren junto a un campo específico, en lugar de simplemente en la parte superior del formulario.
Este proceso funciona especificando uno o más métodos Callback, cada uno de los cuales se llama durante el proceso de validación. Cada uno de estos métodos puede hacer cualquier cosa, incluyendo la creación y asignación de errores de validación.
Nota
Un método retrollamado en sí no falla o devuelve cualquier valor. En su lugar, como verás en el ejemplo, un método retrollamado tiene la posibilidad de agregar «violaciones» de validación directamente.
Aplica a | clase |
Opciones | |
Clase | Symfony\Component\Validator\Constraints\Callback |
Validador | Symfony\Component\Validator\Constraints\CallbackValidator |
# src/Acme/BlogBundle/Resources/config/validation.yml
Acme\BlogBundle\Entity\Author:
constraints:
- Callback:
methods: [isAuthorValid]
// src/Acme/BlogBundle/Entity/Author.php
namespace Acme\BlogBundle\Entity;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @Assert\Callback(methods={"isAuthorValid"})
*/
class Author
{
}
<!-- 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>
// src/Acme/BlogBundle/Entity/Author.php
namespace Acme\BlogBundle\Entity;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints as Assert;
class Autor
{
public static function loadValidatorMetadata(ClassMetadata $metadata)
{
$metadata->addConstraint(new Assert\Callback(array(
'methods' => array('isAuthorValid'),
)));
}
}
The callback method is passed a special ExecutionContextInterface object. Puedes establecer «violaciones» directamente en el objeto y determinar a qué campo se deben atribuir estos errores:
// ...
use Symfony\Component\Validator\ExecutionContextInterface;
class Author
{
// ...
private $firstName;
public function isAuthorValid(ExecutionContextInterface $context)
{
// de alguna manera hay un arreglo de "nombres ficticios"
$fakeNames = array();
// comprueba si el nombre en realidad es un nombre ficticio
if (in_array($this->getFirstName(), $fakeNames)) {
$context->addViolationAt('firstname', 'This name sounds totally fake!', array(), null);
}
}
}
tipo: array predeterminado: array() [opción predeterminada]
Este es un arreglo de los métodos que se deben ejecutar durante el proceso de validación. Cada método puede tener uno de los siguientes formatos:
Cadena de nombre del método
If the name of a method is a simple string (e.g. isAuthorValid), that method will be called on the same object that’s being validated and the ExecutionContextInterface will be the only argument (see the above example).
Arreglo estático de retrollamada
También puedes especificar cada método como un arreglo de retrollamada estándar:
- YAML
# src/Acme/BlogBundle/Resources/config/validation.yml Acme\BlogBundle\Entity\Author: constraints: - Callback: methods: - [Acme\BlogBundle\MyStaticValidatorClass, isAuthorValid]- Annotations
// src/Acme/BlogBundle/Entity/Author.php use Symfony\Component\Validator\Constraints as Assert; /** * @Assert\Callback(methods={ * { "Acme\BlogBundle\MyStaticValidatorClass", "isAuthorValid"} * }) */ class Author { }- XML
<!-- 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
// 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'), ))); } }En este caso, el método estático isAuthorValid será llamado en la clase Acme\BlogBundle\MyStaticValidatorClass. It’s passed both the original object being validated (e.g. Author) as well as the ExecutionContextInterface:
namespace Acme\BlogBundle; use Symfony\Component\Validator\ExecutionContextInterface; use Acme\BlogBundle\Entity\Author; class MyStaticValidatorClass { public static function isAuthorValid(Author $author, ExecutionContextInterface $context) { // ... } }Truco
Si especificas la restricción Retrollamada a través de PHP, entonces también tienes la opción de hacer tu retrollamada o bien un cierre PHP o una retrollamada no estática. Esto no es posible actualmente, sin embargo, para especificar un servicio como una restricción. Para validar usando un servicio, debes crear una restricción de validación personalizada y añadir la nueva restricción a tu clase.