2015-12-29 14 views
8

Symfony 3.0'da FormType üzerinde kapsayıcı nasıl enjekte edilir? Symfony 3 FormType İçinde Kapsayıcıyı Döndür

Benim services.yml dosyası: aksiyon denetleyici olarak

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

: bu hata var

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

: Açıklamalarda gibi

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

+1

$ raporunu 'ReportType :: class' ile değiştirin. Çok sezgisel değil ama bu rapor tipini konteynırdan çekecek. – Cerad

+2

Bu arada, hizmetinizi etiketlemeniz gerekir: http://symfony.com/doc/current/cookbook/form/create_custom_field_type.html#creating-your-field-type-as-a-service – Cerad

+0

Bu mükemmel çalışır ! Teşekkürler – Siol

cevap

0

, düzeltme kolaydır; Yalnızca yapmalıdır:

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

neyse, sınıfın HERHANGİ tür bütün kabı enjekte sizi vazgeçirmek derece olacaktır. Sadece ihtiyaç duyulan hizmeti enjekte etmek daha iyidir.

1

Bunun yerine form fabrikasını kullanın. yapılandırmada

: istediğiniz kadar

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

Ve kullanmak: senin formda

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

olası formu seçeneklerine container eklemek

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

denetleyicinizdeki, tıpkı kullanım formu:

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