Choice

Esta restricción se utiliza para asegurar que el valor dado es uno de un determinado conjunto de opciones válidas. También la puedes utilizar para comprobar que cada elemento de un arreglo de elementos es una de esas opciones válidas.

Aplica a propiedad o método
Opciones
Clase Symfony\Component\Validator\Constraints\Choice
Validador Symfony\Component\Validator\Constraints\ChoiceValidator

Uso básico

La idea básica de esta restricción es que le proporciones un arreglo de valores válidos (esto lo puedes hacer de varias maneras) y ella compruebe que el valor de la propiedad dada existe en el arreglo.

Si tu lista de opciones válidas es simple, la puedes pasar directamente a través de la opción choices:

  • YAML
    # src/Acme/BlogBundle/Resources/config/validation.yml
    Acme\BlogBundle\Entity\Author:
        properties:
            gender:
                - Choice:
                    choices:  [male, female]
                    message:  Choose a valid gender.
    
  • Annotations
    // src/Acme/BlogBundle/Entity/Author.php
    namespace Acme\BlogBundle\Entity;
    
    use Symfony\Component\Validator\Constraints as Assert;
    
    class Autor
    {
        /**
         * @Assert\Choice(choices = {"male", "female"}, message = "Choose a valid gender.")
         */
        protected $gender;
    }
    
  • XML
    <!-- src/Acme/BlogBundle/Resources/config/validation.xml -->
    <class name="Acme\BlogBundle\Entity\Author">
        <property name="gender">
            <constraint name="Choice">
                <option name="choices">
                    <value>male</value>
                    <value>female</value>
                </option>
                <option name="message">Choose a valid gender.</option>
            </constraint>
        </property>
    </class>
    
  • PHP
    // src/Acme/BlogBundle/EntityAuthor.php
    namespace Acme\BlogBundle\Entity;
    
    use Symfony\Component\Validator\Mapping\ClassMetadata;
    use Symfony\Component\Validator\Constraints as Assert;
    
    class Autor
    {
        protected $gender;
    
        public static function loadValidatorMetadata(ClassMetadata $metadata)
        {
            $metadata->addPropertyConstraint('gender', new Assert\Choice(array(
                'choices' => array('male', 'female'),
                'message' => 'Choose a valid gender.',
            )));
        }
    }
    

Suministrando opciones con una función retrollamada

También puedes utilizar una función retrollamada para especificar tus opciones. Esto es útil si deseas mantener tus opciones en una ubicación central para que, por ejemplo, puedas acceder fácilmente a las opciones para validación o para construir un elemento de formulario seleccionado.

// src/Acme/BlogBundle/Entity/Author.php
namespace Acme\BlogBundle\Entity;

class Author
{
    public static function getGenders()
    {
        return array('male', 'female');
    }
}

Puedes pasar el nombre de este método a la opción callback de la restricción Choice.

  • YAML
    # src/Acme/BlogBundle/Resources/config/validation.yml
    Acme\BlogBundle\Entity\Author:
        properties:
            gender:
                - Choice: { callback: getGenders }
    
  • Annotations
    // src/Acme/BlogBundle/Entity/Author.php
    namespace Acme\BlogBundle\Entity;
    
    use Symfony\Component\Validator\Constraints as Assert;
    
    class Autor
    {
        /**
         * @Assert\Choice(callback = "getGenders")
         */
        protected $gender;
    }
    
  • XML
    <!-- src/Acme/BlogBundle/Resources/config/validation.xml -->
    <class name="Acme\BlogBundle\Entity\Author">
        <property name="gender">
            <constraint name="Choice">
                <option name="callback">getGenders</option>
            </constraint>
        </property>
    </class>
    
  • PHP
    // src/Acme/BlogBundle/EntityAuthor.php
    namespace Acme\BlogBundle\Entity;
    
    use Symfony\Component\Validator\Mapping\ClassMetadata;
    use Symfony\Component\Validator\Constraints as Assert;
    
    class Autor
    {
        protected $gender;
    
        public static function loadValidatorMetadata(ClassMetadata $metadata)
        {
            $metadata->addPropertyConstraint('gender', new Assert\Choice(array(
                'callback' => 'getGenders',
            )));
        }
    }
    

Si la retrollamada estática se almacena en una clase diferente, por ejemplo Util, puedes pasar el nombre de clase y el método como un arreglo.

  • YAML
    # src/Acme/BlogBundle/Resources/config/validation.yml
    Acme\BlogBundle\Entity\Author:
        properties:
            gender:
                - Choice: { callback: [Util, getGenders] }
    
  • Annotations
    // src/Acme/BlogBundle/Entity/Author.php
    namespace Acme\BlogBundle\Entity;
    
    use Symfony\Component\Validator\Constraints as Assert;
    
    class Autor
    {
        /**
         * @Assert\Choice(callback = {"Util", "getGenders"})
         */
        protected $gender;
    }
    
  • XML
    <!-- src/Acme/BlogBundle/Resources/config/validation.xml -->
    <class name="Acme\BlogBundle\Entity\Author">
        <property name="gender">
            <constraint name="Choice">
                <option name="callback">
                    <value>Util</value>
                    <value>getGenders</value>
                </option>
            </constraint>
        </property>
    </class>
    
  • PHP
    // src/Acme/BlogBundle/EntityAuthor.php
    namespace Acme\BlogBundle\Entity;
    
    use Symfony\Component\Validator\Mapping\ClassMetadata;
    use Symfony\Component\Validator\Constraints as Assert;
    
    class Autor
    {
        protected $gender;
    
        public static function loadValidatorMetadata(ClassMetadata $metadata)
        {
            $metadata->addPropertyConstraint('gender', new Assert\Choice(array(
                'callback' => array('Util', 'getGenders'),
            )));
        }
    }
    

Opciones disponibles

choices

tipo: array [opción predeterminada]

Una opción requerida (a menos que especifiques callback) — esta es la gran variedad de opciones que se deben considerar en el conjunto válido. El valor de entrada se compara contra ese arreglo.

Callback

tipo: string|array|Closure

Este es un método retrollamado que puedes utilizar en lugar de la opción choices para devolver el arreglo de opciones. Consulta Suministrando opciones con una función retrollamada para más detalles sobre su uso.

multiple

tipo: Boolean predeterminado: false

Si esta opción es true, se espera que el valor de entrada sea un arreglo en lugar de un solo valor escalar. La restricción debe verificar que cada valor del arreglo de entrada se pueda encontrar en el arreglo de opciones válidas. Si no se puede encontrar alguno de los valores ingresados, la validación fallará.

min

tipo: integer

Si la opción multiple es true, entonces puedes usar la opción min para forzar que por lo menos se seleccionen XX valores. Por ejemplo, si min es 3, pero el arreglo de entrada sólo contiene dos elementos válidos, la validación fallará.

max

tipo: integer

Si la opción multiple es true, entonces puedes usar la opción max para forzar que no se seleccionen más de XX valores. Por ejemplo, si max es 3, pero el arreglo ingresado consta de 4 elementos válidos, la validación fallará.

message

tipo: string predefinido: The value you selected is not a valid choice (El valor que seleccionaste no es una opción válida)

Este es el mensaje que recibirás si la opción multiple se establece en false, y el valor subyacente no es válido en el arreglo de opciones.

multipleMessage

tipo: string predefinido: One or more of the given values is invalid (Uno o más de los valores indicados no es válido)

Este es el mensaje que recibirás si la opción multiple se establece en true, y uno de los valores del arreglo subyacente que se está comprobando no está en el arreglo de opciones válidas.

minMessage

tipo: string predefinido: You must select at least {{ limit }} choices (Por lo menos debes elegir {{ limit }} opciones)

Este es el mensaje de error de validación que se muestra cuando el usuario elige demasiado pocas opciones para la opción min.

maxMessage

tipo: string predefinido: You must select at most {{ limit }} choices (Máximo debes elegir {{ limit }} opciones)

Este es el mensaje de error de validación que se muestra cuando el usuario elige más opciones para la opción max.

strict

tipo: Boolean predeterminado: false

Si es true, el validador también comprobará el tipo del valor ingresado. Específicamente, este valor se pasa como el tercer argumento del método in_array de PHP cuando compruebas si un valor está en el arreglo de opciones válidas.

Bifúrcame en GitHub