1

我在 Symfony2 项目中使用 FOSUserBundle。我在用户实体中添加了“生日”字段,因为它在注册表单中是必需的。我还在注册表单中添加了一个适当的字段(类型=生日)。我必须检查用户的年龄是否超过 18 岁。我在本教程之后为此准备了自己的约束。一切正常,但错误消息附加到表单而不是字段,我想要字段旁边的错误消息。相反,我把它放在整个表格之上。表单中的所有其他错误都显示在适当的字段旁边。有谁知道如何强制将约束附加到字段而不是表单?

编辑:

呈现此特定字段的 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>
4

2 回答 2

4

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

public function isFormValid($data, ExecutionContext $context)
{
    if ( $condition == false ) {
        $context->addViolationAt('[date_of_birth].date_of_birth', 'You are too young!');
    }
}
于 2013-05-22T09:04:13.487 回答
1

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

一个例子

让我们以需要验证用户名属性是否为字母数字的验证器为例:

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

于 2013-02-22T15:47:10.633 回答