#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! Спасибо.