Symfony2中的字段旁边不显示自定义约束验证错误

时间:2013-02-22 15:26:22

标签: validation symfony constraints

我在Symfony2项目中使用FOSUserBundle。我在用户实体中添加了“生日”字段,因为它在注册表单中是必需的。我还在注册表中添加了一个正确的字段(type = birthday)。我必须检查用户的年龄是否超过18岁。我为this tutorial后面的这个准备了自己的约束。一切都很完美,但错误信息附加到形式不是字段,我想在字段旁边的错误消息。相反,我把它放在整个表格之上。表单中的每个其他错误都显示在正确的字段旁边。有人知道如何强制将约束附加到字段而不是表单吗?

编辑:

呈现此特定字段的Twig代码片段:

<div class="grid_8" style="margin-bottom:20px;">
      <div class="grid_2 alpha">{{ form_label(form.date_of_birth)}}</div>
      <div class="grid_4">{{ form_widget(form.date_of_birth)}}</div>
      <div class="grid_2 omega">{{ form_errors(form.date_of_birth)}}</div>
</div> 

在表格的开头,我也有:

<div class="grid_8">
  {{form_errors(form)}}
</div>

2 个答案:

答案 0 :(得分:4)

如果您将回调附加到表单 - 而不是特定字段,则应该以不同的方式设置属性路径:

public function isFormValid($data, ExecutionContext $context)
{
    if ( $condition == false ) {
        $context->addViolationAt('[date_of_birth].date_of_birth', 'You are too young!');
    }
}

答案 1 :(得分:1)

您可以使用addViolationAtSubPath()而不是验证程序中使用的经典addViolation()将违规添加到一个特定字段。您可以查看方法定义here

一个例子

让我们以需要验证username属性是字母数字的验证器为例:

class ContainsAlphanumericValidator extends ConstraintValidator
{
    public function validate($value, Constraint $constraint)
    {
        if (!preg_match('/^[a-zA-Za0-9]+$/', $value, $matches)) {
            $this->context->addViolationAtSubPath('username',$constraint->message, array('%string%' => $value));
        }
    }
}

修改

您还可以查看addViolationAtPath()addViolationAt()