用于验证简单值的Symfony验证不适用于LessThan约束


Symfony validation to validate a simple value does not work with LessThan constraint

似乎不可能使用Symfony'Component'Validator'Constraints'LessThan约束来验证一个简单的值。

这里有一个简单的测试:

$lessConstraint = new LessThan();
$lessConstraint->value = 5;
$errors[] = $this->get('validator')->validateValue('This must fail.', $lessConstraint);
var_dump($errors);

由于测试的字符串超过5个字符,我预计会出现约束冲突。但是,结果是一个空的ConstraintViolationList列表:

array(1) { [0]=> object(Symfony'Component'Validator'ConstraintViolationList)#517 (1) { ["violations":"Symfony'Component'Validator'ConstraintViolationList":private]=> array(0) { } } }

Symfony'Component'Validator'Constraints'LessThanOrEqual约束也存在同样的问题。然而,如文档中所示,它与Symfony'Component'Validator'Constraints'Email约束完美配合:如果字符串不是电子邮件,我会得到一个错误。

我犯了什么错?

这是意料之中的事。

我确信您应该使用Range约束。那么这里发生了什么呢?

根据LessThanValidator源文件(此处),只需在左右操作数上使用<运算符即可进行比较。

现在,如果你查阅PHP关于类型比较的参考文献(这里),就会发现:

如果将数字与字符串进行比较,或者比较涉及数字字符串,然后将每个字符串转换为一个数字数值比较

所以,话虽如此,你应该这样做:

$lessConstraint = new Range();
$lessConstraint->max = 5;
$errors[] = $this->get('validator')->validateValue('This must fail.', $lessConstraint);
var_dump($errors);

就是这样。希望这能有所帮助。。。