2015-12-29 8 views
8

Symfony 3.0でFormTypeにコンテナを注入するには?Symfony 3 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() 
関連する問題