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 路由。
我在我的 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 路由。