Php 访问服务覆盖FOS用户包控制器

Php 访问服务覆盖FOS用户包控制器,php,symfony,service,fosuserbundle,Php,Symfony,Service,Fosuserbundle,我是Symfony2的新手, 我正在尝试使用内部服务覆盖控制器 这是寄存器控制器 class RegistrationController extends BaseController { public function registerAction(Request $request) { /** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */ $formFactory = $this-

我是Symfony2的新手, 我正在尝试使用内部服务覆盖控制器

这是寄存器控制器

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,因为这不是扩展控制器。 所以我不知道如何在这个控制器中访问我的服务

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(),
    ));
  }
}
谢谢

$this->get('some_service')
只是symfony base控制器中定义的一个助手快捷方式。查看上面的代码,了解如何调用所有服务:

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

顺便说一句,如果您使用的是最新版本的FOSUserBundle(
dev master
),则可能比重写控制器更适合<代码>注册完成可能适合您的用例。如果查看上面的控制器代码,您可以看到事件何时被调度。您应该公平地使用事件,而不是控制器重写。

谢谢您的回答,这很有效,我添加了一个事件:“security.interactive\u login”,但这只在登录时有效,而不在注册时有效,这就是我添加此事件的原因。如果您有解决方案,请告诉我:)在较新版本中,FOSUserBundle引入了自己的事件,您可以在这些事件上进行侦听。请参见我编辑的答案中的链接