FOSUserBundle: перенаправление регистрации при входе в систему

#symfony #fosuserbundle

#symfony #fosuserbundle

Вопрос:

Мне было интересно, как лучше перенаправить пользователя, который УЖЕ вошел в систему, если он попытается получить доступ к странице регистрации.

Я бы предпочел метод, который не требует от меня переопределения контроллера регистрации просто для реализации проверки и перенаправления входа.

Я просмотрел событие инициализации регистрации, но я не знаю, как инициировать перенаправление, поскольку, похоже, нет способа установить ответ на событие через класс UserEvent.

Спасибо

Комментарии:

1. Переопределение контроллера было бы самым простым способом. Реализация какого-либо прослушивателя, вероятно, будет более сложной и запутанной.

2. Я лично считаю, что использование прослушивателей событий намного аккуратнее (и проще).

Ответ №1:

Я использую что-то вроде следующего..

 namespace AcmeUserBundleEventSubscriber;

use FOSUserBundleEventGetResponseUserEvent;
use FOSUserBundleFOSUserEvents;
use SymfonyComponentEventDispatcherEventSubscriberInterface;
use SymfonyComponentHttpFoundationRedirectResponse;
use SymfonyComponentRoutingGeneratorUrlGeneratorInterface;
use SymfonyComponentSecurityCoreSecurityContextInterface;

class FOSUserSubscriber implements EventSubscriberInterface
{
    protected $router;

    protected $securityContext;

    public function __construct(
        UrlGeneratorInterface $router,
        SecurityContextInterface $securityContext
    )
    {
        $this->router = $router;
        $this->securityContext = $securityContext;
    }

    public static function getSubscribedEvents()
    {
        return array(
            FOSUserEvents::REGISTRATION_INITIALIZE  => 'forwardToRouteIfUser',
        );
    }

    public function forwardToRouteIfUser(GetResponseUserEvent $event)
    {
        if (!$this->securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
            return;
        }

        $url = $this->router->generate('acme_the_route_to_redirect_to');

        $response = new RedirectResponse($url);

        $event->setResponse($response);
    }
} 
  

С

 parameters:
    acme_user.subscriber.fos_user.class: 
            AcmeUserBundleEventSubscriberFOSUserSubscriber

services:
    acme_user.subscriber.fos_user:
        class: %acme_user.subscriber.fos_user.class%
        arguments:
            - @router
            - @security.context
        tags:
            - { name: kernel.event_subscriber 
  

Комментарии:

1. Я не понимал, что можно использовать GetResponseUserEvent! Спасибо.