FOSUserBundle: Redirige l'utilisateur après s'être enregistré avec EventListener
Je veux rediriger l'utilisateur vers une autre forme juste après l'enregistrement, avant qu'il puisse accéder à quoi que ce soit sur mon site (comme dans https://github.com/FriendsOfSymfony/FOSUserBundle/issues/387).
J'ai donc créer un eventListener comme dans la doc :
<?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;
}
}
Services.yml :
services:
rs_user.registration_completed:
class: rs\UserBundle\EventListener\RegistrationConfirmedListener
arguments: [@router]
tags:
- { name: kernel.event_subscriber }
Mais ça ne fonctionne pas, l'utilisateur s'inscrire, il cliquez sur le lien de confirmation dans sa boîte aux lettres, il n'est pas redirigé sur la page que je veux, il est connecté et j'ai juste le message qui dit que le compte est confirmé.
Pourquoi il ne veut pas me diriger vers la route : rsWelcomeBundle_check_full_register comme je veux ?
Grâce
source d'informationauteur user2178964
Vous devez vous connecter pour publier un commentaire.
Pour accomplir ce que vous voulez, vous devez utiliser
FOSUserEvents::REGISTRATION_CONFIRM
au lieu deFOSUserEvents::REGISTRATION_CONFIRMED
.Vous avez alors à la réécriture de réécrire votre classe
RegistrationConfirmedListener
comme:Et votre
service.yml
:REGISTRATION_CONFIRM
reçoit unFOS\UserBundle\Event\GetResponseUserEvent
exemple comme vous pouvez le voir ici: https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/FOSUserEvents.phpIl vous permet de modifier la réponse qui sera envoyée: https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Event/GetResponseUserEvent.php
Pas pourquoi la accepté de répondre fonctionne pour vous REGISTRATION_CONFIRM qui se passe après le jeton est confirmé.
Dans le cas où vous souhaitez effectuer une action, de rediriger vers une autre page avec une forme supplémentaire après le FOS registerAction je dirais que la façon suivante.
C'est le code qui est exécuté sur registerAction une fois le formulaire soumis est valide en FOS:
FOS\UserBundle\Controller\RegistrationController
Comme vous pouvez le voir le premier retour possible qui se passe après FOSUserEvents::REGISTRATION_SUCCESS événement dans le cas où la réponse est nulle qui dans mon cas n'est pas comme je l'ai configuré un expéditeur d'envoyer une confirmation jeton et de FOS est à l'aide d'un auditeur à l'écoute de ce FOSUserEvents::REGISTRATION_SUCCESS événement et après l'envoi d'un e-mail, il définit une réponse de redirection.
FOS\UserBundle\EventListener\EmailConfirmationListener
Ok je comprends! Alors, comment puis-je rediriger vers une autre page?
Je suggère de remplacer checkEmailAction comme il est plus probable que vous ne voulez pas écraser l'auditeur qui envoie un e-mail qui est une partie de votre flux de travail.
Simplement:
TB\UserBundle\Controller\RegistrationController
Comme vous pouvez le voir au lieu de rendre FOS est check_email modèle, j'ai décidé de rediriger l'utilisateur vers son nouveau profil.
Docs comment faire pour remplacer un contrôleur: https://symfony.com/doc/master/bundles/FOSUserBundle/overriding_controllers.html (essentiellement de définir un parent pour votre faisceau et de créer un fichier dans le répertoire avec le même nom que celui de FOS.)
Si vous n'êtes pas à l'aide d'un e-mail de confirmation, vous pouvez rediriger le droit de l'utilisateur après l'envoi du formulaire d'inscription de cette façon :
L'abonné de la déclaration de rester le même :
Pour une solution rapide: vous pouvez également remplacer la route. Disons que vous voulez rediriger vers votre page d'accueil, vous pouvez faire quelque chose comme ceci: