Symfony 6.2无实体表单:约束消息无法翻译该如何解决?
问题原因
表单类中设置的translation_domain仅作用于表单标签、帮助文本等元素,不会自动传递给验证约束。因此你直接给Email约束的message传入翻译键时,Symfony无法识别对应的翻译域,导致无法完成翻译。
解决方法
有两种简洁的修复方式:
方法一:在约束中显式指定翻译域
直接在Email约束的参数里添加translation_domain,指定使用的翻译域:
->add('email', options:[ 'label'=>'form.label.email', 'constraints'=> [ new Email([ 'message' => 'form.error.email', 'translation_domain' => 'job-application' ]) ] ]);
方法二:开启表单约束翻译域继承
如果希望整个表单的所有验证约束都自动继承表单的translation_domain,可以在表单配置中开启constraints_translation_domain选项:
public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults([ 'translation_domain' => 'job-application', 'constraints_translation_domain' => true ]); }
开启后,你无需再给每个约束单独指定翻译域,直接使用new Email(message: 'form.error.email')即可自动完成翻译。
补充说明
Symfony的表单组件与验证组件相对独立,表单的翻译配置不会默认覆盖验证约束的翻译设置,因此必须通过显式指定或开启继承的方式,让约束能正确识别翻译域,避免手动调用translator->trans()的繁琐操作。
内容的提问来源于stack exchange,提问作者MadCatERZ
相关产品推荐
相关产品推荐

