如何在一个Symfony表单中映射两个实体

时间:2014-07-31 14:16:18

标签: forms symfony mapping entities

我现在遇到的问题与Symfony2中的实体和表单有关。

在创建引用一个实体的表单时,我可以通过说:

来简单地连接它
$user = new User();
$form->createForm(new UserType(), $user);
...
$manager->persist($user);
$manager->flush();

这很好用。但是当我有基于其他形式构建的更复杂的形式时,问题就会出现,例如

因此,我们假设我有一个名为 RegistrationType 的表单,其中包含两个名为 UserType 的表单,这些表单连接到用户实体, ProfileType 连接到个人资料实体。

现在,我如何在控制器中处理它?我的意思是,我做不了类似的事情:

$user = new User();
$profile = new Profile();
$form->createForm(new RegisterType(), $user, $profile);
OR
$form->createForm(new RegisterType(), [$user, $profile]);
...
$manager->persist($user);
$manager->flush();

$profile->setUserId($user->getId());
$manager->persist($profile);
$manager->flush();

如果我只传递$ user,那么

$form->createForm(new RegisterType(), $user);

Symfony会抱怨有些属性没有映射,当然我可以将它们设置为“映射”。 =>是的,但我必须稍后手动设置它们。

处理此问题的最佳方式是什么?

提前致谢!

1 个答案:

答案 0 :(得分:2)

制作UserTypeProfileTypeRegistrationType表单。 RegistrationType应添加UserTypeProfileType作为其子级。创建Registration DTO并将其设为data_class RegistrationType。然后你可以写点像

$user = new User();
$profile = new Profile();
$form->createForm(new RegistrationType(), 
           new Registration($user, $profile));