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 |
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:
# src/Acme/BlogBundle/Resources/config/validation.yml
Acme\BlogBundle\Entity\Author:
properties:
gender:
- Choice:
choices: [male, female]
message: Choose a valid gender.
// 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;
}
<!-- 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>
// 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.',
)));
}
}
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.
# src/Acme/BlogBundle/Resources/config/validation.yml
Acme\BlogBundle\Entity\Author:
properties:
gender:
- Choice: { callback: getGenders }
// 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;
}
<!-- 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>
// 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.
# src/Acme/BlogBundle/Resources/config/validation.yml
Acme\BlogBundle\Entity\Author:
properties:
gender:
- Choice: { callback: [Util, getGenders] }
// 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;
}
<!-- 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>
// 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'),
)));
}
}
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.
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.
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á.
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á.
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á.
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.
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.
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.