2012-05-06 10 views
10

Tengo una entidad con varios campos en ella. Uno de ellos está siendo validada después de la presentación de la siguiente forma:Validación de una entrada entera desde un formulario

/** 
* @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; 

estoy teniendo dos problemas con esta solución:

Sólo número entero valores deben ser aceptadas mayor que cero. Sin embargo, también flotantes/dobles están siendo aceptados por esta validación. Sin embargo, si cambio @Assert\Type(type="numeric") a @Assert\Type(type="integer"), ninguna entrada se valida como verdadera. ¿Cómo puedo validar que mi entrada sea un valor entero?

El otro problema es que después de ingresar un valor obviamente inválido (como una cadena de letras) recibo no solo mi mensaje de error alemán para la validación de Tipo sino también el mensaje en inglés 'Este valor debe ser un número válido'. ¿De dónde viene este mensaje y cómo puedo deshacerme de él?

Respuesta

17

Debe utilizar:

@Assert\Type(type="integer") 

Pero tenga cuidado, que debe administrarse con un IntegerType, no un NumberType o una TextType:

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

IntegerType es idéntica a NumberType excepto que se integra el apropiado data transformer.

+0

' @Asertar \ Tipo (tipo = "entero") 'no está funcionando. Eso fue lo primero que intenté. – sprain

+0

¿Has visto la segunda parte de la respuesta? ¿Qué tipo de formulario está utilizando para esta propiedad? –

+1

Usar un número entero como tipo de campo de formulario hizo el truco. Gracias. – sprain

5

Puede utilizar

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

o crear un validador con ctype_digit.

+3

Como esta es una solución que acepta números incluso usando 'text' como tipo de campo, tiene la desventaja de que acepta valores como" ** 123ABC ** ". Tal vez este patrón sea más útil, ya que tampoco acepta valores que comiencen con ceros a la izquierda: '* @Asertar \ Regex (patrón ="/^ ([1-9] [0-9] *) $/")' – insertusernamehere

+0

La versión más corta no comienza con 0, entonces solo se aceptan dígitos' @ Assert \ Regex (patrón = "/^(?! 0) \ d + $ /") ' – Stphane

9

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

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

Aunque no se menciona in the documentation, TypeValidator utiliza también 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)) { 

    ... 
} 
+1

¡Genial, gracias! Creé una solicitud de extracción para agregar esto a la documentación. –

9

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)) 
    ) 
)) 
0

tuve que usar number en el tipo de campo de formulario, pero mostró un asterisco * junto a la etiqueta de entrada aunque es no es obligatorio. Entonces, tuve que usar 'required' => false también. El campo de formulario tipo integer no funcionó. El tipo de datos de campo subyacente es smallint.

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

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

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

Mi versión de Symfony es 2.7.

0

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

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

Pero hay que tener en cuenta que la forma de tipo de campo debe ser un número entero (IntegerType::class), de lo contrario voy a conseguir la validación negativo.

Cuestiones relacionadas