2016-04-27 7 views
3

他に2つの質問があることは知っていますが、誰も私が求めるものを解決する人はいないと思います。symfony 3.0でサービスとしてフォームを定義する

Symfony 2.8には、サービスとして定義されたフォームに「エイリアス」をタグ付けすることについて非推奨の注意があります。フォームを取得するために「createForm」に渡すことができます。

私が間違っているのであれば、私を修正してください今はエイリアスタグなしでサービスを定義する必要があります。

#src/MyBundle/Resources/config/services.yml 
my.form.as.service: 
    class: MyBundle\Form\Type\MyFormType 
    arguments: ["@doctrine.orm.entity_manager",%myparameter1%] 
    tags: { - name: form.type } 

とコントローラで:

$form = $this->createForm('my.form.as.service'); 

しかし、これは私に与えますformNameはgetName関数で 'my_name'を返し、フォームがFQCNを受け取ると予想します。

動作し、githubのsymfonyのメンバーで
use MyBundle\Form\Type\MyFormType; 
... 
$form = $this->createForm(MyFormType::class) 

フォームコンポーネントは、すべての作業を行うことを言います...しかし、私はとseccondサービスを定義するために何をしたい場合:OK、コントローラにここに他の応答を以下に私が変更しました同じクラスですが、%parameter1%の代わりに別のパラメータを使用します。 2.8歳以上では、別のサービスを定義してその名前をcreateForm関数に渡すことができましたが、クラスを直接取得できるようになりました。 (私はそれが奇妙な、または不必要なことができるか、または...)知っている。

symfonyメンバーに:私はJaviereguiluzと一緒にいるので、この変更によりコードを書くことができ、フォームコンポーネントがあなたのサービスをどのように使用するか完全に制御することができなくなります。私たちのライブをとても複雑にするためにフォームエイリアスを削除する必要がありましたか?ありがとう!

答えて

3

ご迷惑をおかけして申し訳ございません。さて、正解

フォームタイプに動的な設定(パラメータなど)が必要な場合は、代わりにフォームタイプオプションを作成する必要があります。これは、動的にこの設定を変更することができます:

class MyFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $form, array $options) 
    { 
     $options['your_setting']; // read the option 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setRequired('your_setting'); // add a required option 
    } 
} 

使用法:

また
$this->createForm(MyFormType::class, null, [ 
    'your_setting' => 'some value', 
]); 

、あなたはまた、いくつかの静的な値またはパラメータに設定をデフォルトすることができます

class MyFormType extends AbstractType 
{ 
    private $yourSetting; 

    public function __construct($yourSetting) 
    { 
     $this->yourSetting = $yourSetting; 
    } 

    // ... 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefault('your_setting', $this->yourSetting); 
    } 
} 

することができますこれについてはOptionsResolver component documentationをご覧ください。

+0

ありがとうWouter、私は何かを言うためのパラメータを言ったが、もし私が望むのは、別のサービスを注入することですか? 3.0より前には、2つのフォームserviesを定義することができました。各サービスは注入が必要ですが、今は...同じフォームの2つのクラスを唯一のオプションとして作成していますか?はい、私は彼らがこのアップデートをあまり考えないと思うと思います... –

+1

@JordiPuig私はあなたに一つのことを約束することができます、コアチームはすべての長所/短所の重さなしに大きな変化を起こさない。同じフォームタイプで注入されるさまざまなサービスの実際のユースケースがありますか? (あなたのフォームタイプはあまりにも多くの場合、データトランスフォーマー/マッパーやフォームリスナーのようなものが必要です) –

+0

今は持っていませんが、それが起こる可能性はかなりあります。私はsymfony githubでこれについて多くの議論をしていました。私の日常的な仕事からは、この変更には何の利点もありませんでしたが、たくさんのコードを書き直さなければなりません...システムを本当に改善するか、それは "数行のコード"とaviod名の間違いを得ることだけでした。とにかく答えに感謝します。 –

0

私は同じ質問をして、ここで自分自身に答え:Symfony 2.8/3.0 upgrade: how to deal with form types with variable parameters?

は、残念ながら、これはsymfony 3.0での制限であり、そのための解決策はありません。

1つの解決策は、(共通のものではなく)フォームごとに1つのクラスを作成し、それぞれがコードの重複を避けるために共通の抽象クラスを拡張することです。

しかし、まだ最適ではない多くのクラスを作成する必要がありました。

関連する問題