2013-03-14 51 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