2013-07-10 45 views
0

我在Symfony2的是新, 我试图重写内部访问服务覆盖FOS用户捆绑控制器

这使用服务控制器是寄存器控制器

class RegistrationController extends BaseController 
{ 
    public function registerAction(Request $request) 
    { 
    /** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */ 
    $formFactory = $this->container->get('fos_user.registration.form.factory'); 
    /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */ 
    $userManager = $this->container->get('fos_user.user_manager'); 
    /** @var $dispatcher \Symfony\Component\EventDispatcher\EventDispatcherInterface */ 
    $dispatcher = $this->container->get('event_dispatcher'); 

    $user = $userManager->createUser(); 
    $user->setEnabled(true); 

    $dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, new UserEvent($user, $request)); 

    $form = $formFactory->createForm(); 
    $form->setData($user); 

    if ('POST' === $request->getMethod()) { 
     $form->bind($request); 

     if ($form->isValid()) { 
      $event = new FormEvent($form, $request); 
      $dispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS, $event); 

      $userManager->updateUser($user); 

      if (null === $response = $event->getResponse()) { 
       $url = $this->container->get('router')->generate('easy_app_user_profile'); 
       $response = new RedirectResponse($url); 
      } 

      $dispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response)); 

      //create UserInfo 
      $doctrine = $this->container->get('doctrine'); 

      $userInfo = new UserInformation(); 
      $userInfo->setUser($user); 

      //save the userInfo 
      $em = $doctrine->getManager(); 
      $em->persist($userInfo); 
      $em->flush(); 

      //add user first login 
      $loginManager = $this->get('user_login_manager'); 
      $loginManager->saveUser($request, $user); 

      return $response; 
     } 
    } 

    return $this->container->get('templating')->renderResponse('FOSUserBundle:Registration:register.html.'.$this->getEngine(), array(
      'form' => $form->createView(), 
    )); 
    } 
} 

接近尾声我正在使用

$loginManager = $this->get('user_login_manager'); 
$loginManager->saveUser($request, $user); 

但我不能使用get,因为这不是扩展控制器。 所以我不知道如何访问到我的服务在这个控制器

感谢

回答

1

$this->get('some_service')只在symfony的控制器定义的助手快捷方式。看看你上面的代码,看看如何调用所有的服务:

$loginManager = $this->container->get('user_login_manager'); 

Btw。如果您使用的是最新版本的FOSUserBundle(dev-master),那么new event system可能比覆盖控制器更好。 REGISTER_COMPLETED可能适合你的使用情况。如果你看一下上面的控制器代码,你可以看到事件发送的时间。你应该公平地使用事件而不是控制器覆盖。

+0

感谢您的回答,这个作品,我添加了一个事件事件:'security.interactive_login',但这只适用于登录,而不是注册,这就是为什么我添加这个。如果你有解决方案,请告诉我:) – Ajouve

+0

在更新的版本中,FOSUserBundle引入了你可以听的自己的事件。请参阅我编辑的答案中的链接 –

+0

谢谢我找到它,我正在努力 – Ajouve