在带有翻译的实体 class 中定义数据转换器 invalid_message 错误

Define data transformer invalid_message error in entity class with translations

我在表单字段上为我的用户 class 创建了一个数据转换器。用户可以输入他们要向其发送私人消息的另一个用户名。它还有一个标题和内容,但现在这并不重要。

这是表单生成器:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('title')
        ->add('content', 'textarea')
        ->add(
            'receiver',
            'text',
            array(
                // validation message if the data transformer fails
                'invalid_message' => 'That is not a valid user',
            )
        );

    $builder->get('receiver')->addModelTransformer(new UserTransformer($this->manager));
}

我想做的是获取 invalid_message 错误并将其放入翻译文件中。问题是我必须写在这里:

->add('receiver',
      'text',
       array('invalid_message' => 'user.invalid')

将从我的翻译中提取。

有没有办法在我的实体 class 中包含此消息以及所有其他验证器,而不是将其包含在表单类型 class 中?我不想在我的文件中到处散播我的验证信息。

为了回答您的问题,如果您真的想将所有消息翻译密钥存储在您的实体中,您可以将它们存储在实体中的常量数组中 class。

例如,您的实体 class 可能看起来像:

//..
class Foo
{
    const MESSAGES = [
        'invalidUser' => 'user.invalid'
    ];

    public static function getMessages()
    {
        return self::MESSAGES;
    }

    //..
}

并在您的数据转换器中:

->add('receiver',
      'text', [
           'invalid_message' => Foo::getMessages()['invalidUser']
       ]

我仍然无法完全理解这背后的动机。您有时需要确定要在数据转换器中显示的消息。那么不直接提供与此消息关联的翻译密钥,而是通过实体检索它有什么意义呢?

你的消息应该聚集的地方只有翻译文件。您的实体 class 中的验证器以及您的数据转换器仅用于提供良好的翻译密钥。