【问题标题】:Custom constraint validation error doesn't display next to field in Symfony2Symfony2 中的字段旁边不显示自定义约束验证错误
【发布时间】:2013-02-08 06:23:32
【问题描述】:

我在 Symfony2 项目中使用 FOSUserBundle。我在用户实体中添加了“生日”字段,因为它在注册表单中是必需的。我还在注册表单中添加了一个适当的字段(类型=生日)。我必须检查用户的年龄是否超过 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>

【问题讨论】:

  • 你能分享你的树枝代码吗?

标签: validation symfony constraints


【解决方案1】:

您可以使用addViolationAtSubPath() 代替验证器中使用的经典addViolation() 将违规添加到一个特定字段。你可以看一下方法定义here

一个例子

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 行得通,谢谢。为什么是 [date_of_birth],而不仅仅是字段的 ID(即 date_of_birth)?
    猜你喜欢
    • 1970-01-01
    • 2012-02-17
    • 2014-10-30
    • 1970-01-01
    • 2015-02-13
    • 2013-11-15
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多