3

我最近一直在尝试使用 Symfony 2 表单,这对于简单的表单非常有用。

但是 - 用于选择框或类似的东西 - 我经常想要表单中的关联实体列表。在几篇博文和 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

是的,您可以从控制器传递选择。只需创建一个选项,而不是通过构造函数注入它,因为构造函数仅在为每个请求创建给定类型的第一种形式时使用。因此,如果您碰巧需要在一个页面上输出多个相同类型的表单,那么如果通过构造函数传递,它们的选择将是相同的。

当您注入可以多次重用而没有任何问题的服务时,通过构造函数向表单类型注入一些东西是有意义的。

文档中和网络上的许多示例都违反了许多最佳实践,但是用尊重实践的示例来教新手一些东西要困难得多。

于 2013-03-14T18:16:08.407 回答