16

我有一个包含多个字段的实体。其中一个正在表单提交后进行验证,如下所示:

/**
 * @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")无输入,则验证为真。如何验证我的输入是否为整数值?

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

4

6 回答 6

24

你应该使用:

@Assert\Type(type="integer")

但要小心,你应该将它与 a 一起使用IntegerType,而不是 aNumberType或 a TextType

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

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

于 2012-05-07T06:51:28.023 回答
16

这对我有用:

 ->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))
     )
 ))
于 2014-08-20T14:06:25.017 回答
9

如果字段类型应该是字符串,您可以使用它来代替:

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

虽然文档中没有提到,但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)) {

  ...
}
于 2013-09-12T01:05:53.540 回答
5

您可以使用

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

或使用ctype_digit.

于 2012-05-06T14:27:38.947 回答
2

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

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

但请记住,表单字段类型应该是整数(IntegerType::class),否则我会得到否定的验证。

于 2017-01-16T11:50:59.887 回答
0

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

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

在提供或不提供类型时,YML 中的Regex约束也不起作用。integer我不知道为什么

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

我的 Symfony 版本是 2.7。

于 2015-06-19T05:31:10.233 回答