Symfony 将转换器服务注入FormType

Symfony 将转换器服务注入FormType,symfony,Symfony,我试图找到一个最可重用的工作选项,以便能够从FormType进行翻译 我的第一个选择是专门为每个表单类型声明服务,方法如下: 服务.yml form.enquiry: class: Acme\DemoBundle\Form\EnquiryType arguments: [@translator] inquiryType.php use Symfony\Component\Translation\Translator; class EnquiryType extends Abst

我试图找到一个最可重用的工作选项,以便能够从FormType进行翻译

我的第一个选择是专门为每个表单类型声明服务,方法如下:

服务.yml

form.enquiry:
    class: Acme\DemoBundle\Form\EnquiryType
    arguments: [@translator]
inquiryType.php

use Symfony\Component\Translation\Translator;
class EnquiryType extends AbstractType {

    public $translator;
    public function __construct(Translator $translator=null)
    {
        $this->translator = $translator;
    }

public function buildForm(FormBuilderInterface $builder, array $options) {
    $tr= $this->translator;
    $msg=$tr->trans('default_error');
    $builder->add ...
MyController.php

 $form = $this->container->get('form.enquiry')->create();
 return $this->render('AcmeDemoBundle:Home:index.html.twig', array(
     'form' => $form->createView()
 ));
给出了这个错误

FatalErrorException:错误:调用未定义的方法Acme\DemoBundle\Form\InquiryType::create()


我想知道如何通过更改代码来解决这个问题,或者更好地找到一个更好的选项,允许我将翻译服务注入任何FormType,而无需单独声明每个FormType服务。

您的
EnqurityType
必须返回整个表单,因此在buildForm中您应该创建整个表单

$builder
->setAction('action')
->setMethod('POST')
->add('field', 'field_type')

在构造函数中,您应该为
TranslatorInterface
其所谓的契约式设计键入提示

虽然我想知道如何解决注入问题,但我最终还是找到了更好的解决方案,只需通过Twig覆盖表单错误呈现,包括自定义Twig主题上的此块,包括反式过滤器

{% block form_errors %}
{% spaceless %}
    {% if errors|length > 0 %}
        {#
    <ul>
        {% for error in errors %}
            <li>{{ error.message }}</li>
        {% endfor %}
    </ul>#}
        {% for error in errors %}
            <div class="field_error">{{ error.message |trans}}</div>
        {% endfor %}
    {% endif %}
{% endspaceless %}
{% endblock form_errors %}
{%block form\u errors%}
{%spaceless%}
{%如果错误|长度>0%}
{#
    {错误%中的错误为%0}
  • {{error.message}}
  • {%endfor%}
# {错误%中的错误为%0} {{error.message | trans}} {%endfor%} {%endif%} {%endspaceless%} {%endblock form_errors%}
要使其与依赖项注入一起正常工作,您需要将其标记为表单。类型:

tags:
    - { name: form.type }
也不要像通常的服务那样从容器中获取它,而是使用controller helper,因为它是一个普通的formType:

$this->createForm(...)

查看:

buildForm()当然有$builder->add行,只是在代码中省略了,因为与此问题无关。那么services.yml和inquiryType中的use&_构造应该是怎样的呢?如果您在
formBuilder
delete
create
中定义了字段,那么构造函数应该看起来像
public function\u构造(TranslatorInterface$translator=null)
按建议完成,但出现以下错误:调用未定义的方法Acme\DemoBundle\Form\inquiryType::createView()。另一方面,我得到了$translator的空值,我是否也应该更改services.yml?O抱歉,没有注意到您的服务定义中缺少
标记
标记:-{name:form.type}