web-dev-qa-db-ja.com

Symfony3-フォームをサービスとして定義する

私のSymfony3-masterプロジェクトでは、このコードを使用してコントローラーにフォームを作成します。

$form = $this->createForm(ApplicantType::class, $applicant);

ここで、このフォームからサービスを作成することにしました。そのため、その中でEntityManagerを使用できます。したがって、Symfony2.xでは、services.ymlでの宣言と次のコード行を使用するだけで、これは非常に簡単になります。

$form = $this->createForm($this->get("applicant.form"), $applicant);

ただし、この最初のパラメーターはフォーム自体ではなく文字列を想定しているため、Symfony3ではこれは不可能になりました。

だから私の質問は:Symfony 3でサービスとしてフォームを作成するにはどうすればいいですか、それともフォーム内でEntityManagerを渡す方法は他にありますか?

助けてくれてありがとう!

17
Mike

フォームタイプをサービスとして定義することは、取得したインスタンスをコンテナからcreateFormに渡すことを意味するものではありません。これを行う場合、フォームコンポーネントが関係している限り、コンテナは関係しません。

サービスとして登録されたフォームタイプを使用するには(フォームコンポーネントがそれを認識できるようにform.typeタグを使用)、名前(つまり、Symfony 2.8+の完全修飾クラス名とタイプ)で参照するだけです。 createFormまたはFormBuilder::addの古いバージョンの名前)。これは、サービスとして登録されているSymfonyコアタイプbtw(textchoiceなど)に対して行うこととまったく同じです。フォームタイプをサービスとして使用する場合、依存関係のないフォームタイプを持ち、最初の使用時に暗黙的に登録されるのではなく、コントローラーのコードはまったく変更されません。

18

これは、Symfony2コードからSymfony3にサービスとしてフォームを挿入するために行ったことです。

私のservice.ymlで変更しました

issue.form:
    class: Gutersohn\Bundle\CoreBundle\Form\IssueType
    arguments: ['@service_container']
    tags:
        - { name: form.type, alias: issue }

issue.form:
    class: Gutersohn\Bundle\CoreBundle\Form\IssueType
    arguments: ['@service_container']
    tags:
        - { name: form.type }

私のコントローラーで変更しました

$form = $this->container->get('form.factory')->create($this->container->get('issue.form'), $issue, [
        "method" => "post",
        "action" => $this->container->get('router')->generate("ticket_add")
]);

$form = $this->container->get('form.factory')->create(IssueType::class, $issue, [
        "method" => "post",
        "action" => $this->container->get('router')->generate("ticket_add")
]); 

GitHubの問題#1701 で、aliemreは次のように述べています:

サービス定義では、form.typeタグを追加するだけで十分です。

app.form.corporation_type:
    class: App\CorporationBundle\Form\CorporationType
    arguments: ["@doctrine.orm.entity_manager"]
    tags:
        - { name: form.type }

コントローラは同じままである必要があります:

$form = $this->createForm(CorporationType::class, $corporation);

私はテストしました、そしてそれは働きます!

5
George Ploscaru

私は問題を調べようとしましたが、これはgithubの変更点です: https://github.com/symfony/symfony/commit/abca2d6fdc89479586e052cd11241d5a9bc885e5#diff-5c1348d69be32426ff20446c9e812365R64

次に、このBCが削除されたSymfonyのPRを見つけました。理由を尋ねると、ここで確認できます: https://github.com/symfony/symfony/pull/16075#issuecomment-16510612

これがその周りのコンセプトに役立つことを願っています!

1
Renato Mefi