Symfony 3 根据翻译信息动态添加属性形成字段

Symfony 3 dynamically add attributes to form fields based on translation messages

我想为每个表单元素实现自定义帮助程序消息(html 数据属性)。帮助消息在 YAML 语言文件 (messages.en.yml) 中定义,并非所有表单元素都有帮助消息。

问题是我不确定是否可以使用 Symfony FormType 或 Symfony Form 事件来完成。

我正在考虑将表单事件创建为服务并注入翻译服务,然后从那里操作数据并添加帮助程序类,但我没有找到任何可靠的例子如何完成。

我考虑的另一个选择是使用 Trait 并在 trait 中注入翻译服务,然后从那里开始开发我的代码,但感觉不太对。

有人可以分享他们的经验并提供解决此特定问题的线索吗?

这是我的设置

messages.en.yml

intro:
        created: Intro created!
        edited:  Intro has been edited successfully!
        deleted: Intro has been has been deleted!
        index:
            title: List of all intros
        new:
            title: New intro
        show:
            title: Details of intro
        edit:
            title: Edit intro
        form:
             title: Title
             content: Content
             isEnabled: Is active
        tooltip:
             title: Please enter title

我的表格类型:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('title', TextType::class, array(
                'label_format' => 'admin.intro.form.%name%',
                'attr' => [
                    'data-helper' => 'Please enter title'
                ]

            )
        )
        ->add('content', TextareaType::class, array(
                'label_format' => 'admin.intro.form.%name%',
                'required' => false,
                'attr' => [
                    'class' => 'mceEditor'
                ]
            )
        )
        ->add('isEnabled', CheckboxType::class, array(
                'label_format' => 'admin.intro.form.%name%',
                'required' => false,
            )

您可以通过 registering the form as a service and injecting the YAML configuration 填写表格。

config.yml

message_config:
    intro:
            created: Intro created!
            edited:  Intro has been edited successfully!
            deleted: Intro has been has been deleted!
            index:
                title: List of all intros
            new:
                title: New intro
            show:
                title: Details of intro
            edit:
                title: Edit intro
            form:
                 title: Title
                 content: Content
                 isEnabled: Is active
            tooltip:
                 title: Please enter title

services.yml

services:
app.form.type.my_form:
    class: AppBundle\Form\Type\MyForm
    arguments:
        - '%message_config%'
    tags:
        - { name: form.type }

现在您可以在 FormType 中使用数组。

<?php

namespace AppBundle\Form\Type;

class MyForm
{
    protected $messages;

    public function __construct(array $messages)
    {
        $this->messages = $messages;
    }
}

如果翻译服务正在使用 YAML 配置,您将改为注入翻译服务。

更新:Symfony 使用 Translator 组件和 Twig 表单主题执行此操作,请参阅以下评论。