首页 > 解决方案 > 打印表单嵌套错误 Symfony 5

问题描述

我正在使用 symfony 表单将 reCaptcha 集成到我的网站。我已经创建了一个自定义表单类型,其中包含一个HiddenType输入。

class ReCaptchaType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('token', HiddenType::class, [
            'constraints' => [
                new NotBlank([
                    'message' => 'Please, verify the captcha.',
                ]),
                new ReCaptchaConstraint([
                    'action' => $options['action'],
                    'projectDir' => $this->projectDir
                ])
            ],
        ]);
    }
}

我使用 javascript 来获取令牌,然后将其设置为 HiddenType 输入,以便我可以获取令牌值并对其进行验证。因此,如您所见,我使用了两个约束,NoBlank 和自定义的 ReCaptchaConstraint。

HiddenType 输入默认为空值。因此,如果未验证验证码,则该值保持空白,并且约束触发失效。此行为按预期工作,并且不会发送表单。在 symfony 调试工具栏中,我得到了相应的消息。

但我想将此消息作为表单错误显示给用户,我有以下模板

{% block re_captcha_errors %}
    {% for child in form.children %}
        {{ form_errors(child) }}
    {% endfor %}
{% endblock %}

有了这个,它应该打印孩子的错误,目前是 HiddenType。并将它们打印为 ReCaptchaType 错误。但它不打印任何东西。实际上,如果我在模板中硬编码某些东西,它会被打印出来,但子错误不会。

我不知道我是否以正确的方式做这件事。这应该工作吗?如何在模板中显示错误消息?

这是我的表单模板,在哪里使用 ReCaptchaType

...
<tr>
    <td class="f-err" colspan="2">
        {{ form_errors(registrationForm.recaptcha) }}
    </td>
</tr>
<tr>
    <td class="f-wig" colspan="2">
        {{ form_widget(registrationForm.recaptcha) }}
    </td>
</tr>
....

标签: symfonytwigsymfony-forms

解决方案


请参阅文档以获取HiddenType. 似乎隐藏的子元素上的错误会冒泡到父元素,因为子元素是隐藏的。

error_bubbling 默认值:true

将错误传递给根表单,否则它们将不可见。

-- https://symfony.com/doc/current/reference/forms/types/hidden.html#error-bubbling

所以寻找错误{{ form_errors(form) }}或设置error_bubblingfalse


推荐阅读