Symfony2 - 对表单类型的依赖注入不传递值


Symfony2 - Dependency injection on form type not passing values

我有一个表单类型,但想使用此表单中的容器来检测当前用户 ID (FOSUserBundle)。我不确定是否最好将容器直接注入表单或用户类中,但我无法正常工作。以下是我的表单类型:

class AddValueType extends AbstractType
{
    private $container;
    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        //build form, get user ID
    }
}

服务.yml:

parameters:
    AddValueType.class: Main'MyBundle'Form'Type'AddValueType
services:
    main.form.addValueType:
        class: "%AddValueType.class%"
        arguments: ['@service_container']

我收到错误Warning: Missing argument 1 for Main'MyBundle'Form'Type'AddValueType::__construct()所以它显然没有正确传递给表单类型。我对依赖注入很陌生,但无法弄清楚我哪里出了问题?我让其他人以同样的方式在我的应用程序中工作,以获得服务。

更新

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add(
                $builder->create('aDate', 'hidden' ,array('empty_data' => new 'DateTime() ))->addViewTransformer( new DateTimeToStringTransformer() )
            )
            ->add('field1', 'hidden')
            ->add('field2', 'hidden')
            ->add('submit', 'submit')
            ->getForm();
        $builder->addEventListener(FormEvents::PRE_BIND, function(FormEvent $event) {
            $data = $event->getData();
            $data['addedByUser'] = $userId;//this is what I need to fetch
            //some other simple logic to set data after form is sent
            $event->setData($data);
        });
    }
    public function getName()
    {
        return 'AddValue';
    }

在我的控制器中创建:

$form = $this->createForm(new AddValueType(), $myDoctrineEntity/Class);

您需要

将服务标记为表单。

main.form.addValueType:
    class: "%AddValueType.class%"
    arguments: ['@service_container']
    tags:
        - { name: form.type, alias: valueType }

表单的名称需要 valueType 。现在,您可以按窗体的名称使用窗体,而无需手动创建新实例。

事实上,注入服务容器是一种不好的做法。

不要将表单声明为服务,但是创建一个新服务并将form.factory和表单注入其中,如下所示:

service.xml

<service id="my_form_handler" class="namespace'FormHandler">
     <argument type="service" id="form.factory" />
     <argument id="yourFormClass">'namespace'of'your'form'class</argument>
</service>

您的表单处理程序:

class FormHandler
{
    private $formFactory;
    private $formType;
    public function __construct($formFactory, $formType) {....}
    public function test()
    {
        $form = $this->formFactory->create(new $this->formType, $entity, $options);
        ....
    }

这对我有用