我从Symfony2开始,我试图覆盖FOSUserBundle的FOS \ UserBundle \ Form \ Handler \ RegistrationFormHandler。
我的代码是:
<?php
namespace Testing\CoreBundle\Form\Handler;
use FOS\UserBundle\Model\UserInterface;
use FOS\UserBundle\Form\Handler\RegistrationFormHandler as BaseHandler;
use Testing\CoreBundle\Entity\User as UserDetails;
class RegistrationFormHandler extends BaseHandler
{
protected function onSuccess(UserInterface $user, $confirmation)
{
// I need an instance of Entity Manager but I don't know where get it!
$em = $this->container->get('doctrine')->getEntityManager();
// or something like: $em = $this->getDoctrine()->getEntityManager
$userDetails = new UserDetails;
$em->persist($userDetails);
$user->setId($userDetails->getId());
parent::onSuccess($user, $confirmation);
}
}
所以,重点是我需要一个Doctrine实体管理器的实例,但我不知道在这种情况下它在何处/如何获得它!
有什么想法吗?
提前致谢!
答案 0 :(得分:2)
在大多数情况下,您不应直接使用EntityManager
。请改用适当的经理/提供商服务。
如果是FOSUserBundle服务,实施UserManagerInterface
就是这样的经理。它可以通过服务容器中的fos_user.user_manager
键访问(它是fos_user.user_manager.default
的联盟)。当然是注册表单处理程序uses that service,可以通过userManager
属性访问它。
您不应该将您的域模型(例如,Doctrine的实体)视为数据库模型的精确表示。这意味着,您应该将对象分配给其他对象(而不是它们的ID)。
Doctrine能够处理实体中的嵌套对象(UserDetails
和User
对象具有直接关系)。最终,User
实体必须configure cascade options。
最后,UserDetails
似乎是每个User
的强制依赖项。因此,您应该覆盖UserManagerInterface::createUser()
而不是表单处理程序 - 无论如何您还没有处理用户的详细信息。
创建您自己的UserManagerInterface
实施:
class MyUserManager extends \FOS\UserBundle\Entity\UserManager {
/**
* {@inheritdoc}
*/
public function createUser() {
$user = parent::createUser();
$user->setUserDetails(new UserDetails());
// some optional code required for a proper
// initialization of User/UserDetails object
// that might require access to other objects
// not available inside the entity
return $user;
}
}
在DIC内注册您自己的经理:
<service id="my_project.user_manager" class="\MyProject\UserManager" parent="fos_user.user_manager.default" />
配置FOSUserBundle以使用您自己的实现:
# /app/config/config.yml
fos_user:
...
service:
user_manager: my_project.user_manager