Redirect FOSUserBundle:在向EventListener注册后重定向用户

Redirect FOSUserBundle:在向EventListener注册后重定向用户,redirect,symfony,fosuserbundle,event-listener,Redirect,Symfony,Fosuserbundle,Event Listener,我想在用户注册后将其重定向到另一个表单,然后他才能访问我网站上的任何内容(如中) 因此,我在文档中创建了一个eventListener: <?php namespace rs\UserBundle\EventListener; use FOS\UserBundle\FOSUserEvents; use FOS\UserBundle\Event\UserEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface

我想在用户注册后将其重定向到另一个表单,然后他才能访问我网站上的任何内容(如中)

因此,我在文档中创建了一个eventListener:

<?php
namespace rs\UserBundle\EventListener;

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

/**
 * Listener responsible to change the redirection at the end of the password resetting
 */
class RegistrationConfirmedListener implements EventSubscriberInterface
{
    private $router;

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

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

    public function onRegistrationConfirmed()
    {
        $url = $this->router->generate('rsWelcomeBundle_check_full_register');
        $response = new RedirectResponse($url);
        return $response;
    }
}
但它不起作用,用户注册后,他点击邮箱中的确认链接,他没有被重定向到我想要的页面上,他被登录了,我只收到了一条消息,上面说帐户已确认

为什么它没有像我想要的那样将我重定向到路径:rsWelcomeBundle\u check\u full\u register


谢谢

要完成您想要的,您应该使用
FOSUserEvents::REGISTRATION\u CONFIRM
而不是
FOSUserEvents::REGISTRATION\u CONFIRM

然后,您必须重写您的类
RegistrationConfirmedListener
如下所示:

class RegistrationConfirmListener implements EventSubscriberInterface
{
    private $router;

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

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

    public function onRegistrationConfirm(GetResponseUserEvent $event)
    {
        $url = $this->router->generate('rsWelcomeBundle_check_full_register');

        $event->setResponse(new RedirectResponse($url));
    }
}
以及您的
服务.yml

services:
    rs_user.registration_complet:
        class: rs\UserBundle\EventListener\RegistrationConfirmListener
        arguments: [@router]
        tags:
            - { name: kernel.event_subscriber }
REGISTRATION\u CONFIRM
接收一个
FOS\UserBundle\Event\GetResponseUserEvent
实例,如下所示:


它允许您修改将发送的响应:

如果您没有使用确认电子邮件,您可以通过以下方式在提交注册表后立即重定向用户:

class RegistrationConfirmationSubscriber implements EventSubscriberInterface
{
    /** @var Router */
    private $router;

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

    public static function getSubscribedEvents()
    {
        return [FOSUserEvents::REGISTRATION_COMPLETED => 'onRegistrationConfirm'];
    }

    public function onRegistrationConfirm(FilterUserResponseEvent $event)
    {
        /** @var RedirectResponse $response */
        $response = $event->getResponse();
        $response->setTargetUrl($this->router->generate('home_route'));
    }
}
订户声明保持不变:

registration_confirmation_subscriber:
    class: AppBundle\Subscriber\RegistrationConfirmationSubscriber
    arguments:
        - "@router"
    tags:
        - { name: kernel.event_subscriber }
不确定为什么接受的答案对您有效,因为注册\u确认发生在令牌确认之后

如果您想执行某个操作,请在FOSregisterAction之后重定向到另一个带有其他表单的页面。我建议采用以下方法

这是FOS在提交的表格有效后在注册表操作上执行的代码:

FOS\UserBundle\Controller\RegistrationController 如您所见,第一个可能的返回发生在FOSUserEvents::REGISTRATION\u SUCCESS事件之后,如果响应为null,那么在我的情况下不会返回,因为我已经配置了一个邮件程序来发送确认令牌,并且FOS正在使用一个侦听器来侦听此FOSUserEvents::REGISTRATION\u SUCCESS事件,并在发送电子邮件后设置重定向响应

FOS\UserBundle\EventListener\EmailConfirmationListener 好吧,我明白了!那么如何重定向到另一个页面? 我建议覆盖checkEmailAction,因为您很可能不想覆盖发送电子邮件的侦听器,因为这是您工作流程的一部分

简单地说:

TB\UserBundle\Controller\RegistrationController 正如您所见,我决定将用户重定向到他的新配置文件,而不是呈现FOS的检查电子邮件模板


说明如何覆盖控制器:(基本上为捆绑包定义父级,并在目录中创建一个与FOS同名的文件。)

快速解决方案:您还可以覆盖路由。假设你想重定向到你的主页,你可以这样做:

 /**
 * @Route("/", name="index")
 * @Route("/", name="fos_user_registration_confirmed")
 * @Template(":Default:index.html.twig")
 */
public function indexAction()
{

还可以使用路由重定向:

fos_user_registration_confirmed:
    path: /register/confirmed
    defaults:
        _controller: FrameworkBundle:Redirect:redirect
        route: redirection_route
        permanent: true

你能给我们看一下你的
src/robStorm/UserBundle/Resources/config/services.yml
文件吗?我刚刚在上一条消息中添加了它,提前谢谢!我也尝试了隐式的_登录事件,但没有办法获取事件并对其使用setResponse方法……这是rs,而不是robstorm,这是一个错误;)始终无法对这些事件执行正确的操作…为了一致性,请将RegistrationConfirmListener重命名为RegistrationSubscriber感谢!问题还在于我没有使用GetResponseUserEvent类型的参数。它工作得很好,但是有没有一种方法可以显示说“您的帐户已确认…等”的页面,然后将用户重定向到我的页面?谢谢;)如果您想首先显示“您的帐户已确认…等”,则不应使用此方法,而应覆盖模板
注册/confirm.html.twig
,并添加一些在XX秒后重定向用户的js。好的,非常感谢;)关于事件,我还有另一个问题:注册后,我必须使用什么事件来设置特定角色?对于将来的读者,如果您使用HWIOAuthBundle,请注意:“HWIOAuthBundle不使用FOSUserBundle注册控制器,因此它永远不会触发这些事件。”;)对我来说(使用FOSUserBundle&HWIOAuthBundle),只有
REGISTRATION\u SUCCESS
可以像预期的那样工作。请说明这是如何工作的(如果可以,请不要要求任何关于symfony的知识)除了按照正确指定
FOSUserEvents::REGISTRATION\u CONFIRM
。@greybeard它通过覆盖路由来工作:不是重定向到默认的FOSUSER页面,而是重定向到您选择的页面(这里是索引路由)@KunwarSiddharthSingh你应该更详细地解释你想要实现的具体目标。请查看之前的答案或文档:@Tons_1感谢您的评论。事实上,我正在购物车上工作,我想当用户进入购物车页面并单击“通过FosUser用户注册”,然后在同一购物车页面上重定向,而不是在主页上注册后重定向。如何将数组从注册控制器传递到EventListener的onRegistrationSuccess方法??事件是一个数据传输对象。因此,当您调度它时($dispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS,$event);)不要使用数组来移动数据。我想将查询字符串参数数组从控制器传递到onRegistrationSuccess方法,因为我必须将数据保存到数据库中。在onRegistrationSuccess中,有没有其他方法可以从我的头顶上获取查询字符串数据,这是您正在分派的事件,对吗?“new FilterUserResponseEvent($user,$request,$response)”,等等RegistrationSuccess($event),从$event中检索字符串,如$事件->getRequest()或其他内容,然后将其保存在DB中。谢谢,伙计,收到了。但是在controller中,我可以从
$request->query->all()
以数组的形式获取所有查询字符串参数,根据您之前的评论,我必须从
$eve获取这些参数
        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 array
 */
public static function getSubscribedEvents()
{
    return array(
        FOSUserEvents::REGISTRATION_SUCCESS => 'onRegistrationSuccess',
    );
}

/**
 * @param FormEvent $event
 */
public function onRegistrationSuccess(FormEvent $event)
{
    /** @var $user \FOS\UserBundle\Model\UserInterface */
    $user = $event->getForm()->getData();

    $user->setEnabled(false);
    if (null === $user->getConfirmationToken()) {
        $user->setConfirmationToken($this->tokenGenerator->generateToken());
    }

    $this->mailer->sendConfirmationEmailMessage($user);

    $this->session->set('fos_user_send_confirmation_email/email', $user->getEmail());

    $url = $this->router->generate('fos_user_registration_check_email');
    $event->setResponse(new RedirectResponse($url));
}
/**
 * @return \Symfony\Component\HttpFoundation\Response
 */
public function checkEmailAction()
{
    /** @var UserManager $userManager */
    $userManager = $this->get('fos_user.user_manager');
    /** @var string $email */
    $email = $this->get('session')->get('fos_user_send_confirmation_email/email');

    $user = $userManager->findUserByEmail($email);

    return $this->redirect($this->generateUrl('wall', ['username' => $user->getUsername()]));
}
 /**
 * @Route("/", name="index")
 * @Route("/", name="fos_user_registration_confirmed")
 * @Template(":Default:index.html.twig")
 */
public function indexAction()
{
fos_user_registration_confirmed:
    path: /register/confirmed
    defaults:
        _controller: FrameworkBundle:Redirect:redirect
        route: redirection_route
        permanent: true