如何在Symfony 3中使用控制器外的转换器服务?

时间:2016-08-09 09:39:32

标签: php symfony symfony-forms

我有一个表单类型:

<?php

// src/AppBundle/Form/ProductType.php
namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Translation\TranslatorInterface;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

class ProductType extends AbstractType
{

    private $translator;

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

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class)
            ->add('save', SubmitType::class)
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Product',
        ));
    }
}

如您所见,我已尝试设置我的表单类型以注入翻译器。在我的服务中,我有:

parameters:
#    parameter_name: value

services:
    app.form.product:
        class: AppBundle\Form\ProductType
        arguments: ["@translator"]

但是收到以下错误:

Catchable Fatal Error: Argument 1 passed to AppBundle\Form\ProductType::__construct() must implement interface
     

Symfony \ Component \ Translation \ TranslatorInterface,没有给出,调用   在   /path/to/symfony/bundle/vendor/symfony/symfony/src/Symfony/Component/Form/FormRegistry.php   在第85行并定义....

有人可以告诉我是什么给出的吗?我很确定服务类型是错误的,但无法找到我需要拯救生命的那个。

1 个答案:

答案 0 :(得分:2)

检查表单的服务定义,将服务正确标记为form.type,如here in the doc所述。

根据news announcement,从版本2.6开始,翻译器组件被定义为translator.default之类的服务。

例如,你应该有:

services:
    app.form.product:
        class: AppBundle\Form\ProductType
        arguments: ["@translator.default"]
        tags:
            - { name: form.type }

希望这个帮助