Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用Symfony形式分离关注点_Php_Oop_Symfony_Domain Driven Design_Modular Design - Fatal编程技术网

Php 用Symfony形式分离关注点

Php 用Symfony形式分离关注点,php,oop,symfony,domain-driven-design,modular-design,Php,Oop,Symfony,Domain Driven Design,Modular Design,我最近一直在尝试使用Symfony 2表单,这对简单表单非常有用 但是,为了在选择框或类似的地方使用,我通常需要表单中关联实体的列表。在一些博客帖子和Symfony文档中,他们提出了类似的建议 //BlogPostType implements FormTypeInterface public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('category',

我最近一直在尝试使用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
    );
}

有人知道如何实现这一点吗?

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

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


文档和Web中的许多示例违反了许多最佳实践,但要用示例教授新手一些与实践相关的知识要困难得多。

通过选项传递这些示例是可以的,但如何将实体列表传递给“实体”类型的表单控件呢。根据Symfony文档,我只能查询实体…您问题中显示的方式是正确的-只需将实体集合传递给
实体
类型的
选项