【发布时间】:2015-02-04 08:30:30
【问题描述】:
我在我的 Symfony 2 项目中实现了 FOSUserBundle 来管理我的成员。每次成功填写表格(注册、更改密码...)时,我都会将用户重定向到我的主页。为此,我使用捆绑提供的 SUCCESS 事件(请参阅文档:Hooking into the controllers)。
它适用于 CHANGE_PASSWORD_SUCCESS 和 PROFILE_EDIT_SUCCESS 事件,但不适用于 FOSUserEvents::REGISTRATION_SUCCESS 事件。用户注册后我没有被重定向(显示默认捆绑“显示配置文件”页面)。 编辑:(默认捆绑“检查电子邮件”页面显示为启用通过电子邮件确认选项注册)。
我已经实现了这个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 }
【问题讨论】:
-
您使用的是电子邮件确认吗?
-
@Qoop 是的,我愿意。确切地说,我想避免重定向到注册确认页面,并在我的主页上显示一条消息。
-
那么在您通过电子邮件确认之后,它会将您带到注册确认页面?在这种情况下,您应该收听的事件是
FOSUserEvents::REGISTRATION_CONFIRM,但这确实需要GetResponseUserEvent而不是FormEvent,因此您应该相应地处理它。 (github.com/FriendsOfSymfony/FOSUserBundle/blob/master/…) -
不完全是。当您使用经过验证的表单进行注册时,您将被重定向到显示已发送电子邮件的页面。此时,我想将用户重定向到我的主页并显示一条消息(一封电子邮件已发送......)。稍后当用户通过单击电子邮件的链接进行确认时,将使用 RegistrationController 的方法 confirmAction()。所以我认为正确的事件是 REGISTRATION_SUCCESS。
-
对了。可能是在您的侦听器之后调用电子邮件确认侦听器,这意味着由于稍后将它们添加到调度程序的顺序,正在再次设置响应。更改优先级,以便您的优先级在 FOS 侦听器可能对其进行排序之后,所以
FOSUserEvents::REGISTRATION_SUCCESS => array('onFormSuccess', -10),
标签: php symfony fosuserbundle