简短问题:如何将EntityManager注入symfony2 3.0+中的嵌入表单类型? 注意:我提到了嵌入式表单类型,而不仅仅是父表单
长问题: 在以前版本的Symfony2(< 2.6)中,我发现自己需要以下内容:我有一个实体A,它有一个实体B,它有一个实体C,每个实体都拥有它自己的形式,并且在每个实体中表单类型我需要使用实体管理器。
在以前的版本中,我在控制器中执行了以下操作:
$em = $this->getDoctrine()->getManager();
$a = new A();
$form = $this->createForm(new AType($em), $a);
然后在AType中我能够在构造函数中使用$ em并继续将其传递给childs:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('b', new BType($this->em))
;
}
在BType.php中,我会在buildForm中执行相同的操作,将$ em传递给CType。
我现在面临的问题是,为了让你在symfony2 3.0+中定义嵌入式表格,你必须做这样的事情:
$form = $this->createForm(AType::class, $a);
这样做而无需访问控制器只留下我(我所知道的)一个选项,将表单定义为服务。有了这个选项,我有两个问题,一个是他们在文档中指定的,如果表单将在你的应用程序的几个部分中使用,那么应该使用这个问题,在这种情况下,这个表单只是在一个部分的应用程序和我有ABC层次结构,以便拥有适当的数据库结构(类似于公司>所有者>员工关系)。我的另一个问题是,如果我将表单定义为服务,我知道我可以使用:
$form = $this->createForm('servicename', $a);
在控制器中会注入EntityManager,但是对于BType和CType,如何使用AType作为服务将EntityManager注入其中?
我认为非常难看的最后一个想法/尝试是将A,B,C定义为服务并在控制器中构建表单。
答案 0 :(得分:2)
好的,我用@Cerad
来解决这个问题app.form.a:
class: AppBundle\Form\AType
arguments: ["@doctrine.orm.entity_manager"]
tags:
- { name: form.type, alias: app.form.a }
app.form.b:
class: AppBundle\Form\BType
arguments: ["@doctrine.orm.entity_manager"]
tags:
- { name: form.type, alias: app.form.b }
app.form.c:
class: AppBundle\Form\CType
arguments: ["@doctrine.orm.entity_manager"]
tags:
- { name: form.type, alias: app.form.c }
然后在你打电话时在控制器中:
$form = $this->createForm(AType::class, $a);
显然背景中的Symfony2会查找服务并注入依赖项,我的困惑是在使用createForm之前必须自己调用服务之前...我没有看到任何关于此的文档..
然后,在您执行的类型中:
private $em;
public function __construct(EntityManager $em)
{
$this->em = $em;
}
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('b', BType::class)
;
}
如果将它定义为服务,Symfony也会注意注入BType的依赖项。
谢谢@Cerad!你的评论让我进行了这个测试!