2014-12-12 2 views
1

У меня есть тип формы, но я хотел бы использовать контейнер в этой форме для определения текущего идентификатора пользователя (FOSUserBundle). Я не уверен, что лучше всего вводить контейнер в форму или пользовательский класс напрямую, но я не могу заставить работать. Ниже мой тип формы:Symfony2 - инъекция зависимостей по типу формы, не передающая значения

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() так что, очевидно, не передается от типа формы правильно. Я довольно новичок в инъекции зависимостей, но не могу понять, где я ошибаюсь? У меня есть другие, работающие в моем приложении, таким же образом для служб.

UPDATE

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

+0

Выглядит хорошо для меня. Вы пробовали очистить кеш? – Machiel

+0

@Machiel yeah, 'php app/console cache: clear' и удаленные файлы из приложения/кеша вручную тоже. Я работаю в app_dev.php, но попробовал его для производства тоже и все равно не повезло – john

+1

А, извините, вы должны это проверить: http://symfony.com/doc/current/cookbook/form/create_custom_field_type.html У вас есть для определения вашего сервиса как формы. – Machiel

ответ

4

Вам необходимо пометить услугу как форму.

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

Название формы valueType. Теперь вы можете использовать форму по имени вместо создания нового экземпляра вручную.

И действительно, введение в контейнер обслуживания плохой практики.

+1

Рассмотрите возможность использования службы security.context вместо полного контейнера. Это даст вам доступ к текущему пользователю через токен. – Cerad

+0

Я не понимаю, что теги слишком хорошо, но попробовал это раньше, не повезло. Я попытался снова с очисткой кеша, но не повезло. Я использую значение, возвращаемое функцией getName(), как значение «alias». – john

+0

@john Не могли бы вы обновить свой вопрос так, как вы создаете форму? – Waaghals

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

Это сработало для меня

+0

Я не уверен, что вы сможете создать свою форму с помощью фабрики форм. Поскольку он не помечен, он не будет подхвачен Symfony. – Waaghals

Смежные вопросы