Symfony 2: FOSUserBundle: Использование событий FOSUser для перенаправления
Я внедрил FOSUserBundle в свой проект Symfony 2 для управления своими участниками. Каждый раз, когда форма успешно заполняется (регистрация, смена пароля...) Я перенаправляю пользователя на свою домашнюю страницу. Для этого я использую события УСПЕХА, предоставляемые пакетом (см. Документацию: Подключение к контроллерам).
Он отлично работает для событий CHANGE_PASSWORD_SUCCESS и PROFILE_EDIT_SUCCESS, но не работает для события FOSUserEvents::REGISTRATION_SUCCESS. Я не перенаправляется после регистрации пользователя (отображается страница "показать профиль" пакета по умолчанию). ИЗМЕНИТЬ: (страница пакета по умолчанию "проверить электронную почту" отображается, если включена опция подтверждения регистрации по электронной почте).
Может ли кто-нибудь помочь мне понять, почему? Мой код здесь ниже:
Спасибо вам за вашу помощь.
Слушатель :
<?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 }
3 answers
Я думаю, что вы подключаете не то событие.
Согласно тому, что я нашел в контроллере регистрации FOSUserBundle, вы должны подписаться на событие FOSUserEvents::REGISTRATION_COMPLETED
.
Я подтверждаю решение, предложенное Qoop в 5-м комментарии основного поста.
Поскольку включено подтверждение регистрации по электронной почте, используется прослушиватель подтверждения по электронной почте. Этот слушатель устанавливает ответ на 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\Список событий\Список подтверждений электронной почты::Процесс регистрации:
public static function getSubscribedEvents()
{
return [
FOSUserEvents::REGISTRATION_SUCCESS => [
['onRegistrationSuccess', -10],
],
];
}
Если вы этого не сделаете, то программа Emailconfirmationlistener будет вызвана раньше, и вы будете перенаправлены на маршрут fos_user_registration_check_email.