Callback

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

Configurando

  • YAML
    # src/Acme/BlogBundle/Resources/config/validation.yml
    Acme\BlogBundle\Entity\Author:
        constraints:
            - Callback:
                methods:   [isAuthorValid]
    
  • Annotations
    // src/Acme/BlogBundle/Entity/Author.php
    namespace Acme\BlogBundle\Entity;
    
    use Symfony\Component\Validator\Constraints as Assert;
    
    /**
     * @Assert\Callback(methods={"isAuthorValid"})
     */
    class Author
    {
    }
    
  • XML
    <!-- 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
    // 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'),
            )));
        }
    }
    

El método Callback

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);
        }
    }
}

Opciones

methods

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:

  1. 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).

  2. 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.

Bifúrcame en GitHub