将转换器服务注入FormType

时间:2014-07-15 08:33:10

标签: symfony

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

我的第一个选择是以这种方式专门为每个FormType声明一项服务:

services.yml

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

EnquiryType.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 \ EnquiryType :: create()

我想知道如何通过更改代码来解决它,甚至更好地找到一个更好的选项,允许我将转换器服务注入任何FormType,而无需单独声明每个FormType服务。

3 个答案:

答案 0 :(得分:1)

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

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

在构造函数中你应该通过契约

键入TranslatorInterface其被调用设计的提示

答案 1 :(得分:1)

虽然我想知道如何解决注入问题,但我终于设法找到了一个更好的解决方案,只是简单地覆盖了Twig的表单错误呈现,包括我的自定义twig主题上的这个块,包括trans过滤器

{% 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 %}

答案 2 :(得分:1)

要使其与依赖注入一起正常工作,您需要将其标记为form.type:

tags:
    - { name: form.type }

也不要像通常的服务那样从容器中获取它,但是使用控制器帮助器,因为它是一个普通的formType:

$this->createForm(...)

请查看:http://symfony.com/doc/2.8/form/form_dependencies.html