$this->createFormBuilder(null, array(
'validation_constraint' => new Collection(array(
'randominput' => array(
new NotBlank(),
new Email(),
new MyCustomConstraint()
)
))
->add('randominput', 'text');
提交结果(从 html 中删除了必需的属性,使用 firebug):
来自 Email() 约束的消息没有出现,因为在该约束中存在一段代码,我认为是 NotBlank() 约束的克隆/硬代码
if (null === $value || '' === $value) {
return;
}
我认为 Email() 约束应该是 NotBlank() 的子...
如果 NotBlank() 发现违规,我希望不执行 MyCustomConstraint()。所以如果有一些选项会很好,例如“breakNextConstraintExecutionOnFirstViolation”=> true。因此,如果我为一个字段设置了 10 个约束,而第 3 个约束设置了违规,那么接下来的 7 个约束将不会被执行。
如果 symfony2 中不存在这种逻辑/选项,那么如果我可以从 MyCustomConstraint 类访问“验证”服务并重用现有约束但不为每个新约束编写硬代码,那就太好了:
class MyCustomConstraintValidator extends ConstraintValidator
{
public function validate($value, Constraint $constraint)
{
// use the validator to validate the value, not hardcode
if (count( $this->get('validator')->validateValue(
$value,
new NotBlank()
)) > 0)
{
return;
}
$this->context->addViolation('MyCustomConstraint Message...');
}
}
所以我的问题是:我应该怎么做才能防止一个文件出现多个违规消息并且不要在每个新的约束硬代码中使用?
PS 在我以前的项目中(不是在 symfony 上),我制作的表单只显示一条错误消息。因此,用户一一填写字段,只看到一个错误,但没有提交表单,并且每个字段都填满了红色错误(并吓坏了一些用户)。但现在至少我想解决这个问题。