Symfony表单错误消息参数使用

3

在Symfony表单错误中,消息参数数组的目的是什么?

例如,我有以下情况:在一个表单上,我有一个订阅者,根据用户提供的信息可能会调用API,并向Symfony表单添加一些附加错误。

因此,当出现错误时,我会在字段上添加一个新的错误:

$myForm->get('name')->addError(
    new FormError('name.api_invalid', null, array('{{ api_name }}' => $someValue))
);

在message.en.yml文件中,'name.api_invalid'被定义为

name.api_invalid: "The API says the name is actually {{ api_name }}. Please fix before proceeding."

尽管消息被翻译,但是"参数"并没有被替换。

这难道不是表单错误参数应该工作的方式吗?

注意:使用<code></code>可以使其正常工作。

$myForm->get('name')->addError(
    new FormError(
        $this->translator->trans('name.api_invalid', array('{{ api_name }}' => $someValue))
    )
);

但我真的很好奇那些错误参数是什么。谢谢!

1
我不确定这个想法是否可行,但我建议将 {{ api_name }} 替换为 %api_name%,这更符合Symfony的约定和参数使用方式。你目前使用的翻译信息看起来像Twig变量,但实际上并不是。 - Jason Roman
@JasonRoman 嗯...我选择了{{ api_name }},因为这也是Symfony约束消息中使用变量的方式(http://symfony.com/doc/current/reference/constraints/Length.html)。尝试使用%代替,但仍然没有运气。无论如何,最终这只是一个标记,所以每个开发人员喜欢的语法都应该可以工作...但事实并非如此 :) - medowlock
1个回答

4

您所关注的行为在Symfony 2.2中发生了变化:

现在,翻译验证错误是可选的。如果您愿意,仍然可以手动进行翻译,或者简化模板以输出已经翻译好的消息。

如果您比较2.1版本中的form_errors2.2版本中的form_errors,您将看到显示错误的方式有所不同。您可以覆盖该块并按旧方式执行,然后在需要的任何地方导入该模板,或者您可以像上面所做的那样简单地翻译错误消息(这是我通常所做的,也是完全可以接受的方法)。

如果您选择使用$translator->trans,那么我建议在参数中使用%..%,正如Symfony文档所述:

占位符可以采用任何形式,因为完整的消息是使用PHP strtr函数重构的。但是推荐使用%...%形式,以避免在使用Twig时出现问题。

您正在使用的{{ }}更多地是用于使用Symfony验证器及其如何构建违规行为(此处有示例)。

现在,如果您希望自动翻译消息和参数而不是手动抛出FormError,那么我建议为您要做的任何事情创建一个自定义验证器,并在其中构建消息。否则,只需按照您已经找到的方式手动翻译即可。


1
非常好的解释。谢谢! - medowlock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接