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

时间:2014-12-12 13:46:04

标签: php symfony

我有一个表单类型,但希望使用此表单中的容器来检测当前用户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
    }
}

Services.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);

2 个答案:

答案 0 :(得分:4)

您需要将服务标记为表单。

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

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

确实注入服务容器是不好的做法。

答案 1 :(得分:0)

不要将您的表单声明为服务,但是请创建一个新服务并将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);
        ....
    }

这对我有用

相关问题