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 }
Author: Community, 2015-02-04

3 answers

Я думаю, что вы подключаете не то событие. Согласно тому, что я нашел в контроллере регистрации FOSUserBundle, вы должны подписаться на событие FOSUserEvents::REGISTRATION_COMPLETED.

 0
Author: Yann Eugoné, 2015-02-04 08:56:43

Я подтверждаю решение, предложенное 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));
    }
}
 0
Author: Cruz, 2017-05-23 10:30:05

На самом деле я думаю, что правильный ответ находится в документе

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.

 0
Author: Rodrigo Lopez Guerra, 2017-01-04 19:16:46