验证表单中的整数输入

时间:2012-05-06 13:05:17

标签: 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;

我在使用此解决方案时遇到两个问题:

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

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

6 个答案:

答案 0 :(得分:20)

您应该使用:

@Assert\Type(type="integer")

但请注意,您应该使用IntegerType,而不是NumberTypeTextType

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

IntegerTypeNumberType相同,只是它整合了正确的data transformer

答案 1 :(得分:10)

这对我有用:

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

答案 2 :(得分:9)

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

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

虽然未提及in the documentation,但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)) {

  ...
}

答案 3 :(得分:5)

您可以使用

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

或使用ctype_digit创建验证程序。

答案 4 :(得分:1)

从Symfony v2.3版本开始,您应该使用:

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

但请记住,表单字段类型应为整数(IntegerType::class),否则我将获得否定验证。

答案 5 :(得分:0)

我必须在表单字段类型中使用number,但它在输入标签旁边显示了一个星号*,尽管它不是必需的。所以,我也必须使用'required' => false。表单字段类型integer不起作用。基础字段数据类型为smallint

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

YML中的Regex约束也不起作用,而类型为integer或未提供任何内容。我不知道为什么

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

我的Symfony版本是2.7。