2016-05-25 4 views
1

Я пытаюсь перенаправить пользователя в другую форму, прежде чем пользователь получит подтверждение по электронной почте. Поэтому после отправки формы регистрации я хочу перенаправить пользователя в другую форму для заполнения, чтобы я мог назначать роли пользователю. После подачи этой формы пользователь должен получить подтверждение по электронной почте. После подтверждения пользователь автоматически войдет в систему.Ошибка в перенаправлении пользователя после события REGISTRATION_SUCCESS в FOSUserBundle

Полный код User management with FUB

RegistrationSuccessListener.php

namespace Usr\UserBundle\EventListener; 

use FOS\UserBundle\FOSUserEvents; 
use FOS\UserBundle\Event\GetResponseUserEvent; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\Routing\Generator\UrlGeneratorInterface; 

class RegistrationSuccessListener implements EventSubscriberInterface 
{ 
private $router; 

public function __construct(UrlGeneratorInterface $router) 
{ 
    $this->router = $router; 
} 

/** 
* {@inheritDoc} 
*/ 
public static function getSubscribedEvents() 
{ 
    return array(
     FOSUserEvents::REGISTRATION_SUCCESS => 'onRegistrationSuccess' 
    ); 
} 

public function onRegistrationSuccess(GetResponseUserEvent $event) 
{ 
    $url = $this->router->generate('fos_user_registration_success'); 
    $event->setResponse(new RedirectResponse($url)); 
} 
} 

И мой services.yml

services: 
usr_user.registration.success: 
    class: Usr\UserBundle\EventListener\RegistrationSuccessListener 
    arguments: ["@router"] 
    tags: 
     - { name: kernel.event_subscriber } 

Я получаешь г ошибка:

Type error: Argument 1 passed to Usr\UserBundle\EventListener\RegistrationSuccessListener::onRegistrationSuccess() must be an instance of FOS\UserBundle\Event\GetResponseUserEvent, instance of FOS\UserBundle\Event\FormEvent given 

RegistrationController.php

namespace Usr\UserBundle\Controller; 

use FOS\UserBundle\FOSUserEvents; 
use FOS\UserBundle\Event\FormEvent; 
use FOS\UserBundle\Event\GetResponseUserEvent; 
use FOS\UserBundle\Event\FilterUserResponseEvent; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; 
use Symfony\Component\Security\Core\Exception\AccessDeniedException; 
use FOS\UserBundle\Model\UserInterface; 
use FOS\UserBundle\Controller\RegistrationController as BaseController; 

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

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

    $event = new GetResponseUserEvent($user, $request); 
    $dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, $event); 

    if (null !== $event->getResponse()) { 
     return $event->getResponse(); 
    } 

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

    $form->handleRequest($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->generateUrl('fos_user_registration_confirmed'); 
      $response = new RedirectResponse($url); 
     } 

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

     return $response; 
    } 

    return $this->render('FOSUserBundle:Registration:register.html.twig', array(
     'form' => $form->createView(), 
    )); 
} 

/** 
* Tell the user to check his email provider 
*/ 
public function checkEmailAction() 
{ 
    $email = $this->get('session')->get('fos_user_send_confirmation_email/email'); 
    $this->get('session')->remove('fos_user_send_confirmation_email/email'); 
    $user = $this->get('fos_user.user_manager')->findUserByEmail($email); 

    if (null === $user) { 
     throw new NotFoundHttpException(sprintf('The user with email "%s" does not exist', $email)); 
    } 

    return $this->render('FOSUserBundle:Registration:checkEmail.html.twig', array(
     'user' => $user, 
    )); 
} 

/** 
* Receive the confirmation token from user email provider, login the user 
*/ 
public function confirmAction(Request $request, $token) 
{ 
    /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */ 
    $userManager = $this->get('fos_user.user_manager'); 

    $user = $userManager->findUserByConfirmationToken($token); 

    if (null === $user) { 
     throw new NotFoundHttpException(sprintf('The user with confirmation token "%s" does not exist', $token)); 
    } 

    /** @var $dispatcher \Symfony\Component\EventDispatcher\EventDispatcherInterface */ 
    $dispatcher = $this->get('event_dispatcher'); 

    $user->setConfirmationToken(null); 
    $user->setEnabled(true); 

    $event = new GetResponseUserEvent($user, $request); 
    $dispatcher->dispatch(FOSUserEvents::REGISTRATION_CONFIRM, $event); 

    $userManager->updateUser($user); 

    if (null === $response = $event->getResponse()) { 
     $url = $this->generateUrl('fos_user_registration_confirmed'); 
     $response = new RedirectResponse($url); 
    } 

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

    return $response; 
} 

/** 
* Tell the user his account is now confirmed 
*/ 
public function confirmedAction() 
{ 
    $user = $this->getUser(); 
    if (!is_object($user) || !$user instanceof UserInterface) { 
     throw new AccessDeniedException('This user does not have access to this section.'); 
    } 

    return $this->render('FOSUserBundle:Registration:confirmed.html.twig', array(
     'user' => $user, 
     'targetUrl' => $this->getTargetUrlFromSession(), 
    )); 
} 

private function getTargetUrlFromSession() 
{ 
    // Set the SecurityContext for Symfony <2.6 
    if (interface_exists('Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface')) { 
     $tokenStorage = $this->get('security.token_storage'); 
    } else { 
     $tokenStorage = $this->get('security.context'); 
    } 

    $key = sprintf('_security.%s.target_path', $tokenStorage->getToken()->getProviderKey()); 

    if ($this->get('session')->has($key)) { 
     return $this->get('session')->get($key); 
    } 
} 

public function registercuccessAction() 
{ 
    return $this->render('::base.html.twig', array()); 
} 
} 

ответ

0

I know that is not the best practice solution but it can help you, just change the selected route name.

enter image description here

+0

Ее не решает проблему, как код застрял в сразу после вызова REGISTRATION_SUCCESS, что Разгром изменения никогда казнены. – napestershine