2015-12-29 10 views
8

Jak wstrzyknąć pojemnik na FormType w Symfony 3.0?Symfony 3 Inject Container w FormType

Mój plik services.yml:

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

W regulatorze Działanie:

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

mam ten błąd:

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

+1

Zamień $ raport na "ReportType :: class". Niezbyt intuicyjny, ale w końcu spowoduje wyciągnięcie typu raportu z kontenera. – Cerad

+2

Przy okazji, musisz oznaczyć swoją usługę: http://symfony.com/doc/current/cookbook/form/create_custom_field_type.html#creating-your-field-type-as-a-service – Cerad

+0

To działa doskonale ! Dzięki – Siol

Odpowiedz

0

jak w komentarzach, poprawka jest łatwe; powinieneś zrobić tylko:

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

W każdym razie, bardzo zniechęciłbym cię do wstrzyknięcia całego pojemnika w JAKIEJKOLWIEK klasie. Lepiej wstrzyknąć tylko potrzebną usługę.

1

Zamiast tego należy użyć fabryki formularzy.

W konfiguracji:

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

W formularzu dodawania container do możliwych opcji forma:

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

i używać go jak chcesz:

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

W kontrolerze, po prostu użyj formularza:

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