2013-03-14 54 views
3

我一直在嘗試最近使用Symfony 2的形式,這對於簡單的表單來說非常好。用Symfony格式分離問題

但是,對於在選擇框或類似的東西中使用,我經常想要一個表單中的關聯實體列表。在一些相關博客文章和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 
    ); 
} 

有沒有人知道這是如何實現的?

回答

6

是的,你可以通過控制器的選擇。只需創建一個選項,而不是通過構造函數注入它,因爲只有在爲每個請求創建給定類型的第一個表單時纔會使用構造函數。因此,如果您碰巧需要在頁面上輸出多個相同類型的表單,則通過構造函數傳遞它們的選擇將相同。

通過構造函數將某些內容注入到表單類型時,在注入可多次重用的服務時沒有任何問題是有意義的。

許多文檔和Web上的例子都違反了很多最佳實踐,但要用一些例子尊重實踐來教新手會困難得多。

+0

好的,通過選項傳遞它,但我怎麼可以傳遞一個實體列表的形式控制類型'實體'。根據Symfony文檔,我只能查詢實體... – Stivni 2013-03-14 18:45:04

+2

在您的問題中顯示的方式是正確的 - 只需將實體集合傳遞給「實體」類型的「選擇」選項即可。 – 2013-03-14 19:25:01