symfony - 打印表单嵌套错误 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>
....
解决方案
请参阅文档以获取HiddenType
. 似乎隐藏的子元素上的错误会冒泡到父元素,因为子元素是隐藏的。
error_bubbling 默认值:
true
将错误传递给根表单,否则它们将不可见。
-- https://symfony.com/doc/current/reference/forms/types/hidden.html#error-bubbling
所以寻找错误{{ form_errors(form) }}
或设置error_bubbling
为false