3

私は最近Symfony2フォームを使おうとしていますが、これは単純なフォームに非常に適しています。

しかし、-選択ボックスなどで使用するために-フォーム内の関連するエンティティのリストが必要になることがよくあります。いくつかのブログ投稿とSymfonyのドキュメントで、彼らはこのようなものを提案しています...

//BlogPostType implements FormTypeInterface
public function buildForm(FormBuilderInterface $builder, array $options)
{
  $builder
  ->add('category', null, array(
    'property' => 'name',
    'query_builder' => function(EntityRepository $er) use($options) {
      return $er->createQueryBuilder('category')->orderBy('category.name', 'ASC');
    }
  );
}

ドメイン駆動設計、特に関心の分離に多くの注意を払っているので、関連するエンティティをSymfonyのカスタムフォームタイプにバインドする唯一のオプションは、カスタムでクエリすることであるとは信じがたいです。フォームタイプ。

私の意見では、フォームはクエリを実行するべきではないため、これはSoCに違反します。このように、フォームは常に同じエンティティを取りますが、表示するエンティティを選択するのはフォームではありません...

フォームビルダーにフォームの作成を依頼するコントローラーは、関連するオブジェクトをカスタムフォームタイプコンストラクターなどに挿入する必要があります...

//BlogPostType implements FormTypeInterface
public function __construct(array $categories) {
  $this->categories = $categories;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
  $builder
    ->add('category', null, array(
      'property' => 'name',
      'choices' => $this->categories
    );
}

誰かがこれをどのように達成できるか知っていますか?

4

1 に答える 1

6

はい、コントローラーから選択肢を渡すことができます。コンストラクターは、リクエストごとに特定のタイプの最初のフォームを作成するときにのみ使用されるため、コンストラクターを介してオプションを注入する代わりに、オプションを作成するだけです。そのため、ページに同じタイプのフォームを複数出力する必要がある場合、コンストラクターを介して渡された場合、それらの選択は同じになります。

コンストラクターを介してフォーム型に何かを注入することは、何回も問題なく再利用できるサービスを注入する場合に意味があります。

ドキュメントや Web 上の多くの例は、多くのベスト プラクティスに違反していますが、実践を尊重した例で初心者に何かを教えるのははるかに難しいでしょう。

于 2013-03-14T18:16:08.407 に答える