簡體   English   中英

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

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

您需要將服務標記為表單。

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

這對我有用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM