La validación de un número entero de entrada de un formulario

Que tiene una entidad con varios campos. Uno de ellos está siendo validado después de la forma de presentación como sigue:

/**
 * @var integer $anzahl
 *
 * @ORM\Column(name="anzahl", type="integer")
 * @Assert\NotBlank(message="Bitte geben Sie eine Kistenanzahl an.")
 * @Assert\Type(type="numeric", message="Die Kistenanzahl muss eine Zahl sein.")
 * @Assert\Min(limit="1", message="Sie müssen mindestens eine Kiste suchen oder anbieten.")
 */
private $anzahl;

Tengo dos problemas con esta solución:

Sólo valores enteros mayores que cero debe ser aceptado. Sin embargo, también los flotadores/dobles están siendo aceptadas por esta validación. Sin embargo, si cambio de @Assert\Type(type="numeric") a @Assert\Type(type="integer") ninguna entrada está validado como verdadero. ¿Cómo puedo validar mi entrada para ser un valor entero?

El otro problema es que, después de entrar obviamente un valor no válido (como una cadena de letras) yo no sólo recibe mi alemán mensaje de error de la validación del Tipo, sino también el mensaje en inglés de ‘Este valor debe ser un número válido’. De dónde viene este mensaje proviene y cómo puedo deshacerme de él?

OriginalEl autor sprain | 2012-05-06

6 respuestas

  1. 19

    Que se debe utilizar:

    @Assert\Type(type="integer")

    Pero tenga cuidado, usted debe usar con un IntegerType, no NumberType o un TextType:

    Symfony\Component\Form\Extension\Core\Type\IntegerType 

    IntegerType es idéntica a NumberType salvo que se integra el correcto datos del transformador.

    @Assert\Type(type="integer") no está funcionando. Esa fue la primera cosa que hice.
    Has visto la segunda parte de la respuesta? ¿Qué tipo de formulario están utilizando para esta propiedad?
    Utilizando entero como tipo de campo de formulario hizo el truco. Gracias.
    Assert\Min() está en desuso symfony.com/doc/2.2/reference/constraints/Min.html
    Esta respuesta ha sido publicado hace 2 años.

    OriginalEl autor Paweł Jędrzejewski

  2. 10

    Esto funciona para mí:

     ->add('field_name', 'integer', array(
    'label' => 'Your label here', 
    'data' => 0, //default value
    'precision' => 0, //disallow floats
    'constraints' => array(
    new Assert\NotBlank(), 
    new Assert\Type('integer'), 
    new Assert\Regex(array(
    'pattern' => '/^[0-9]\d*$/',
    'message' => 'Please use only positive numbers.'
    )
    ),
    new Assert\Length(array('max' => 2))
    )
    ))
    Hola Tony En mi caso regex está trabajando muy bien, pero el Tipo de la función entero no está funcionando. Esta es la pregunta para mí, porque he revisado todo el código ya he añadido el Tipo de uso en mi código.

    OriginalEl autor Tony Knibb

  3. 9

    Si el tipo de campo debe ser una cadena, puede utilizar esto en su lugar:

    /**
    * @Assert\Type(type="digit")
    */

    Aunque no se mencione en la documentación, TypeValidator también utiliza ctype_* funciones.

    Ver \Symfony\Component\Validator\Constraints\TypeValidator:

    public function validate($value, Constraint $constraint)
    {
    ...
    $ctypeFunction = 'ctype_'.$type;
    ...
    } elseif (function_exists($ctypeFunction) && call_user_func($ctypeFunction, $value)) {
    ...
    }
    Genial, gracias! He creado un pull request para agregar esto a la documentación.

    OriginalEl autor

  4. 5

    Puede utilizar

    /**
    * @Assert\Regex(pattern="/\d+/")
    */

    o crear un validador con ctype_digit.

    Como esta es una solución que se acepta números incluso el uso de text como el tipo de campo, tiene la desventaja de que acepta valores como “123ABC“. Tal vez este patrón sería más útil, como también no aceptar los valores de partida con ceros a la izquierda: * @Assert\Regex(pattern="/^([1-9][0-9]*)$/")
    Versión más corta no se inicia con 0, entonces sólo dígitos son aceptados@Assert\Regex(pattern="/^(?!0)\d+$/")

    OriginalEl autor Chinoisfurax

  5. 1

    A partir de Symfony v2.3 de la versión que se debe utilizar:

    /**
    * @Assert\Type(type="integer")
    * @Assert\GreaterThan(0)
    */

    Pero tenga en cuenta que los formularios de tipo de campo debe ser entero (IntegerType::class), de lo contrario voy a conseguir negativo de validación.

    OriginalEl autor Stan Fad

  6. 0

    Tuve que usar number en el tipo de campo de formulario, pero mostró un asterisco * junto a la etiqueta de entrada, aunque no es obligatorio. Así que,tuve que usar 'required' => false así. El tipo de campo de formulario integer no funciona. El campo subyacente tipo de datos es smallint.

    ->add('storey', 'number', array('required' => false))

    La Regex restricción en YML no está funcionando demasiado mientras que el tipo es integer o nada. No sé por qué

    storey:
    - Regex: '/^[0-9]+$/'

    Mi versión de Symfony es 2.7.

    En mi caso regex está trabajando muy bien, pero el Tipo de la función entero no está funcionando. Esta es la pregunta para mí, porque he revisado todo el código ya he añadido el Tipo de uso en mi código.

    OriginalEl autor Sithu

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *