使用Symfony2 3.0 +

时间:2016-01-07 21:55:53

标签: php forms symfony dependency-injection entitymanager

简短问题:如何将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定义为服务并在控制器中构建表单。

1 个答案:

答案 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!你的评论让我进行了这个测试!