验证表单中的整数输入

spr*_*ain 14 validation symfony

我有一个包含多个字段的实体.其中一个在提交表格后得到验证如下:

/**
 * @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;
Run Code Online (Sandbox Code Playgroud)

我有这个解决方案的两个问题:

只接受大于零的整数值.但是,此验证还接受浮动/双打.但是,如果我更改@Assert\Type(type="numeric")@Assert\Type(type="integer")no输入被验证为true.如何验证输入是否为整数值?

另一个问题是,在输入明显无效的值(如字母串)后,我不仅会收到类型验证的德语错误消息,还会收到英文消息"此值应为有效数字".这条消息来自哪里,如何摆脱它?

小智 21

你应该使用:

@Assert\Type(type="integer")
Run Code Online (Sandbox Code Playgroud)

但要小心,你应该使用它IntegerType,而不是a NumberType或a TextType:

Symfony\Component\Form\Extension\Core\Type\IntegerType 
Run Code Online (Sandbox Code Playgroud)

IntegerTypeNumberType除了它集成了适当的数据转换器之外,它是完全相同的.

  • Assert\Min()已被弃用http://symfony.com/doc/2.2/reference/constraints/Min.html (3认同)

Ton*_*ibb 11

这对我有用:

 ->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))
     )
 ))
Run Code Online (Sandbox Code Playgroud)


小智 9

如果字段类型应该是字符串,则可以使用此字符:

/**
 * @Assert\Type(type="digit")
 */
Run Code Online (Sandbox Code Playgroud)

虽然没有提到的文件中,TypeValidator也利用ctype_*功能.

\Symfony\Component\Validator\Constraints\TypeValidator:

public function validate($value, Constraint $constraint)
{
  ...

  $ctypeFunction = 'ctype_'.$type;

  ...

  } elseif (function_exists($ctypeFunction) && call_user_func($ctypeFunction, $value)) {

  ...
}
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以使用

/**
 * @Assert\Regex(pattern="/\d+/")
 */
Run Code Online (Sandbox Code Playgroud)

或创建验证器ctype_digit.

  • 因为这是一个接受数字的解决方案,即使使用`text`作为字段类型,它的缺点是它接受像"**123ABC**"这样的值.也许这种模式会更有用,因为它也不接受以前导零开头的值:`*@Assert\Regex(pattern ="/ ^([1-9] [0-9]*)$ /") (3认同)