Symfony 2:FOSUserBundle:使用 FOSUserEvents 进行重定向

Symfony 2 : FOSUserBundle : Using FOSUserEvents for Redirection

我在我的 Symfony 2 项目中实现了 FOSUserBundle 来管理我的成员。每次成功填写表格(注册、更改密码...)时,我都会将用户重定向到我的主页。为此,我使用了捆绑包提供的 SUCCESS 事件(请参阅文档:Hooking into the controllers)。

它适用于 CHANGE_PASSWORD_SUCCESS 和 PROFILE_EDIT_SUCCESS 事件,但不适用于 FOSUserEvents::REGISTRATION_SUCCESS 事件。用户注册后我没有被重定向(显示默认的 bundle 'show profile' 页面)。 编辑:(默认捆绑 'check email' 页面显示为启用了通过电子邮件确认注册选项)。

我已经实现了这个code

有人可以帮我理解为什么吗?我的代码如下:

感谢您的帮助。

听者:

<?php

// src/FBN/UserBundle/EventListener/FormSuccessListener.php

namespace FBN\UserBundle\EventListener;

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

/**
 * Listener responsible to change the redirection when a form is successfully filled
 */
class FormSuccessListener implements EventSubscriberInterface
{
    private $router;

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

    /**
     * {@inheritDoc}
     */
    public static function getSubscribedEvents()
    {
        return array(
            FOSUserEvents::REGISTRATION_SUCCESS => 'onFormSuccess',    // Not working
            FOSUserEvents::CHANGE_PASSWORD_SUCCESS => 'onFormSuccess', // Working
            FOSUserEvents::PROFILE_EDIT_SUCCESS => 'onFormSuccess',    // Working                   
        );
    }

    public function onFormSuccess(FormEvent $event)
    {
        $url = $this->router->generate('fbn_guide_homepage');

        $event->setResponse(new RedirectResponse($url));
    }
}

服务:

services:
    fbn_user.formsuccess_listener:
        class: FBN\UserBundle\EventListener\FormSuccessListener
        arguments: [@router]
        tags:
            - { name: kernel.event_subscriber }

我认为你钩错了事件。 根据我在 RegistrationController of FosUserBundle 中的发现,您必须订阅 FOSUserEvents::REGISTRATION_COMPLETED 事件。

我在主post的第5条评论中确认了Qoop提出的解决方案。

由于启用了邮件注册确认,所以使用了邮件确认监听器。此侦听器在我自己的侦听器之后设置对 FOSUserEvents::REGISTRATION_SUCCESS 的响应。所以我不得不改变我的听众的优先级以设置响应:

所以这是修改后的监听器:

// src/FBN/UserBundle/EventListener/FormSuccessListener.php

namespace FBN\UserBundle\EventListener;

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

/**
 * Listener responsible to change the redirection when a form is successfully filled
 */
class FormSuccessListener implements EventSubscriberInterface
{
    private $router;

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

    /**
     * {@inheritDoc}
     */
    public static function getSubscribedEvents()
    {
        return array(
            FOSUserEvents::REGISTRATION_SUCCESS => array('onFormSuccess',-10),
            FOSUserEvents::CHANGE_PASSWORD_SUCCESS => array('onFormSuccess',-10), 
            FOSUserEvents::PROFILE_EDIT_SUCCESS => array('onFormSuccess',-10),                        
        );
    }

    public function onFormSuccess(FormEvent $event)
    {
        $url = $this->router->generate('fbn_guide_homepage');

        $event->setResponse(new RedirectResponse($url));
    }
}

实际上我认为正确的答案在文档中

http://symfony.com/doc/master/bundles/FOSUserBundle/controller_events.html

同时启用确认的注册成功监听¶

当您获得注册确认并且想要连接到 FOSUserEvents::REGISTRATION_SUCCESS 事件时,您必须优先调用此侦听器,然后再调用 FOS\UserBundle\EventListener\EmailConfirmationListener::onRegistrationSuccess:

public static function getSubscribedEvents()
{
    return [
        FOSUserEvents::REGISTRATION_SUCCESS => [
            ['onRegistrationSuccess', -10],
        ],
    ];
}

如果您不这样做,EmailConfirmationListener 将被提前调用,您将被重定向到 fos_user_registration_check_email 路由。