1

我从 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 实体管理器的实例,但在这种情况下我不知道在哪里/如何获得它!

任何想法?

提前致谢!

4

1 回答 1

2
  1. EntityManager在大多数情况下,您不应该直接使用。请改用适当的管理器/提供者服务。

    在 FOSUserBundle 服务实现的情况下UserManagerInterface就是这样一个管理器。它可以通过fos_user.user_manager服务容器中的键访问(它是 的别名fos_user.user_manager.default)。当然,注册表单处理程序使用该服务,它可以通过userManager属性访问。

  2. 您不应将域模型(即 Doctrine 的实体)视为数据库模型的精确表示。这意味着,您应该将对象分配给其他对象(而不是它们的 id)。

    Doctrine 能够处理实体中的嵌套对象(UserDetails并且User对象具有直接关系)。最终,您将不得不为实体配置级联选项。User

  3. 最后,UserDetails似乎是每个User. 因此,您不应该覆盖UserManagerInterface::createUser()表单处理程序 - 无论如何您都不会在那里处理用户的详细信息。

    1. 创建自己的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;
          }
      }
      
    2. 在 DIC 中注册自己的经理作为服务:

      <service id="my_project.user_manager" class="\MyProject\UserManager" parent="fos_user.user_manager.default" />
      
    3. 配置 FOSUserBundle 以使用您自己的实现:

       # /app/config/config.yml
       fos_user:
           ...
           service:
               user_manager: my_project.user_manager
      
于 2012-09-25T02:26:23.950 回答