Symfony自定义表单约束将错误写入父表单

时间:2015-02-20 15:30:05

标签: php validation symfony symfony-forms

我在Symfony中创建了自定义表单类型和约束。

约束附加到表单类型,如下所示:

->add('customField', 'customField', array(
            'required' => 
            'mapped' => false,
            'constraints' => array(new CustomField()),
        ))

其中CustomField是约束类。

约束验证器的validate()方法如下所示:

public function validate($value, Constraint $constraint)
{
    //I know this will always fail, but it's just for illustration purposes
    $this->context->addViolation($constraint->message);
}

我更改了表单的默认模板,如下所示:

{% block form_row -%}
<div class="form-group">
    {{- form_widget(form) -}}
    {{- form_errors(form) -}}
</div>
{%- endblock form_row %}

{% block customField_widget %}
{% spaceless %}
    <!-- actually different but you get the idea -->
    <input type="text" name="customField" id="customField" />
{% endspaceless %}
{% endblock %}

{% block form_errors -%}
    {% if errors|length > 0 -%}
        {%- for error in errors -%}
            <small class="help-block">
                {{ error.message }}
            </small>
        {%- endfor -%}
    {%- endif %}
{%- endblock form_errors %}

在显示表单的模板中,我添加了一些代码来显示附加到整个表单的错误,而不是单个字段错误:

{{ form_start(formAdd) }}
                    {% if formAdd.vars.valid is same as(false) -%}
                        <div class="alert alert-danger">
                            <strong>Errors!</strong> Please correct the errors indicated below.
                            {% if formAdd.vars.errors %}
                                <ul>
                                {% for error in formAdd.vars.errors %}
                                    <li>
                                        {{ error.getMessage() }}
                                    </li>
                                {% endfor %}
                                </ul>
                            {% endif %}
                        </div>
                    {%- endif %}
...

所有这些问题,这个特定字段的验证器,是将约束违规附加到表单对象而不是customField表单类型。这会导致错误最终显示为表单的常规错误,而不是显示为字段错误。

现在,这不是我添加的唯一自定义表单类型和验证器,但它是唯一一个显示此行为的表单,而我无法识别此表单和其他表单之间的区别。你能发现这里有什么问题吗?

3 个答案:

答案 0 :(得分:3)

我自己对此进行了整理。它与约束或验证器无关。问题在于自定义表单类型(我在我的问题中没有描述)。问题是这种表单类型具有“形式”作为复合类型的父类。这意味着默认情况下(根据docs),错误冒泡也是如此,这反过来意味着“该字段的任何错误都将附加到主窗体,而不是特定字段”

答案 1 :(得分:1)

您必须specify path in your validator

 $this->context
            ->buildViolation($constraint->message)
            ->atPath('customField')
            ->addViolation();

答案 2 :(得分:0)

你必须设置&#39; error_bubbling&#39;在自定义表单类型中为false

class CustomFieldType extends AbstractType
{
        public function getName()
        {
                return 'customField';
        }
        public function configureOptions(OptionsResolver $resolver)
        {
                $resolver->setDefault('error_bubbling', false);
        }
}