私の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を渡す方法は他にありますか?
助けてくれてありがとう!
フォームタイプをサービスとして定義することは、取得したインスタンスをコンテナからcreateForm
に渡すことを意味するものではありません。これを行う場合、フォームコンポーネントが関係している限り、コンテナは関係しません。
サービスとして登録されたフォームタイプを使用するには(フォームコンポーネントがそれを認識できるようにform.type
タグを使用)、名前(つまり、Symfony 2.8+の完全修飾クラス名とタイプ)で参照するだけです。 createForm
またはFormBuilder::add
の古いバージョンの名前)。これは、サービスとして登録されているSymfonyコアタイプbtw(text
、choice
など)に対して行うこととまったく同じです。フォームタイプをサービスとして使用する場合、依存関係のないフォームタイプを持ち、最初の使用時に暗黙的に登録されるのではなく、コントローラーのコードはまったく変更されません。
これは、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);
私はテストしました、そしてそれは働きます!
私は問題を調べようとしましたが、これはgithubの変更点です: https://github.com/symfony/symfony/commit/abca2d6fdc89479586e052cd11241d5a9bc885e5#diff-5c1348d69be32426ff20446c9e812365R64
次に、このBCが削除されたSymfonyのPRを見つけました。理由を尋ねると、ここで確認できます: https://github.com/symfony/symfony/pull/16075#issuecomment-16510612
これがその周りのコンセプトに役立つことを願っています!