gpt4 book ai didi

php - 使用 Symfony2 3.0+ 将 EntityManager 注入(inject)嵌入式 FormTypes

转载 作者:搜寻专家 更新时间:2023-10-31 21:04:39 25 4
gpt4 key购买 nike

简短的问题:如何将 EntityManager 注入(inject) symfony2 3.0+ 中的嵌入式表单类型? 注意:我提到了嵌入式表单类型,而不仅仅是父表单

长问题:在 Symfony2 的早期版本(<2.6)中,我发现自己需要以下内容:我有一个实体 A,它有一个实体 B,它有一个实体 C,每个实体都有自己的形式,在每个实体形式类型中,我有需要使用实体管理器。

在以前的版本中,我在 Controller 中执行了以下操作:

$em = $this->getDoctrine()->getManager();
$a = new A();
$form = $this->createForm(new AType($em), $a);

然后在 AType 中,我能够在构造函数中使用 $em 并继续将其传递给 child :

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);

在无法访问 Controller 的情况下以这种方式执行此操作只给我(据我所知)一个选项,将表单定义为服务。使用此选项我有 2 个问题,一个是他们在文档中指定,如果要在应用程序的多个部分中使用该表单,则应使用此表单,在这种情况下,该表单将仅用于应用程序和我拥有 A-B-C 层次结构,以便拥有适当的数据库结构(类似于公司 > 所有者 > 员工关系)。我的另一个担忧是,如果我将表单定义为服务,我知道我可以使用:

$form = $this->createForm('servicename', $a);

在 Controller 中,这将注入(inject) EntityManager,但是 BType 和 CType 呢,我如何使用 AType 作为服务将 EntityManager 注入(inject)它们?

我认为非常丑陋的最后一个想法/尝试是将 A、B、C 定义为服务并在 Controller 中构建表单。

最佳答案

好的,我通过@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 }

然后在调用时在 Controller 中:

$form = $this->createForm(AType::class, $a);

显然 Symfony2 在后台寻找服务并注入(inject)依赖项,我的困惑是在使用 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 也会负责注入(inject) BType 的依赖项。

谢谢@Cerad!你的评论让我做了这个测试!

关于php - 使用 Symfony2 3.0+ 将 EntityManager 注入(inject)嵌入式 FormTypes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34665904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com