2015-12-29 3 views
8

Как ввести контейнер в FormType в Symfony 3.0?Symfony 3 Inject Container in FormType

Мой services.yml файл:

services: 
    advertiser.form.report: 
     class: App\AdvertiserBundle\Form\ReportType 
     arguments: ["@service_container"] 

В контроллере действия:

$report = $this->get('advertiser.form.report'); 
$form = $this->createForm($report); 

Я получил эту ошибку:

Expected argument of type "string", "App\AdvertiserBundle\Form\ReportType" given

+1

Заменить $ report «ReportType :: class». Не очень интуитивно, но это приведет к вытаскиванию типа отчета из контейнера. – Cerad

+2

Кстати, вам нужно будет пометить ваш сервис: http://symfony.com/doc/current/cookbook/form/create_custom_field_type.html#creating-your-field-type-as-a-service – Cerad

+0

Это отлично работает ! Спасибо – Siol

ответ

0

Как и в комментариях, исправление легко; вы должны делать только:

$form = $this->createForm(ReportType::class); 

Во всяком случае, я бы сильно отговорить вас от инъекций всего контейнера в любом виде класса. Лучше всего вводить только необходимый сервис.

1

Используйте вместо этого фабрику форм.

В конфигурации:

services: 
    advertiser.form.report: 
     class: 'Symfony\Component\Form\Form' 
     factory: ['@form.factory', 'create'] 
     arguments: [App\AdvertiserBundle\Form\ReportType, null, {container: '@service_container'}] 

В вашей форме добавить container возможных вариантов формы:

/** 
* @param OptionsResolver $resolver 
*/ 
public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults([ 
     'container' => null, 
     //The rest of options 
    ]); 
} 

И использовать его, как вы хотите:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $container = $options['container']; 
    //The rest of logic 
} 

В контроллере, просто Форма использования:

$this->get('advertiser.form.report'); //It's a ready-to-use form, you don't need to call $this->createForm()