Цель: перенаправить пользователя в зависимости от статуса на весь сайт, когда пользователь вошел в систему.
Мне нужно заставить пользователя находиться на одной странице, пока он не изменит свой профиль Итак, я пытаюсь сделать перенаправление с помощью ядра событий, но у меня бесконечный цикл. однако я пытался избежать этого перенаправления, когда страница хотела
Итак, пожалуйста, найдите то, что я пытаюсь сделать
class TokenSubscriber implements EventSubscriberInterface {
private $user;
private $tokenStorage;
private $router;
protected $redirect;
public function __construct(TokenStorageInterface $tokenStorage, RouterInterface $router
) {
$this->tokenStorage = $tokenStorage;
$this->router = $router;
}
public function onKernelController(FilterControllerEvent $event) {
$controller = $event->getController();
if (!is_array($controller)) {
return;
}
$this->user = $this->tokenStorage->getToken()->getUser();
if ($this->user->getValider() == 3 && $controller[1] == 'indexUserAction' && $controller[0] instanceof DefaultUserController) {
$this->redirect = null;
} else {
$this->redirect = 'user_index';
}
}
public function onKernelResponse(FilterResponseEvent $event) {
if (null !== $this->redirect) {
$url = $this->router->generate($this->redirect);
$event->setResponse(new RedirectResponse($url));
}
}
public static function getSubscribedEvents() {
return array(
KernelEvents::CONTROLLER => 'onKernelController',
KernelEvents::RESPONSE => 'onKernelResponse',
);
}
}




Вы можете попробовать это, но использование -> get ('_ route') обычно должно использоваться только для отладки. Вы должны сбросить событие и ответ, чтобы узнать, что еще вы можете использовать.
public function onKernelRequest(GetResponseEvent $event)
if ($event->getRequest()->get('_route') != 'user_index'){
$event->setResponse(new Response('[NOT_ALLOWED]'));
}
}
Может нужно вернуть редирект? $ event-> setResponse (новый RedirectResponse ('user_index'));
это то, что я сделал, но у меня всегда бесконечный цикл
Что вы получите от var_dump ($ event-> getRequest () -> get ('_ route')); умереть();
у меня есть ноль
Это должно решить вашу проблему
public function onKernelController(FilterControllerEvent $event) {
$controller = $event->getController();
if (!is_array($controller)) {
return;
}
$this->user = $this->tokenStorage->getToken()->getUser();
if ($this->user->getValider() == 3 && $controller[1] == 'indexUserAction' && $controller[0] instanceof DefaultUserController) {
$this->redirect = null;
} else {
$this->redirect = 'user_index';
}
// Add this to Empty redirect if on already same page
if ($event->getRequest()->get('_route') == 'user_index'){
$this->redirect = null;
}
}
спасибо, но это не работает. Я все еще в бесконечном цикле
Теперь перенаправление работает, но когда страница загружается, все мои css et javascript не являются загрузчиком, потому что перенаправление, как мне кажется. Работаю как раз в ответе ядра.
public function onKernelResponse(FilterResponseEvent $event){
if ($event->getRequest()->get('_route') != null && $event->getRequest()->get('_route') != 'user_index') {
$url = $this->router->generate('user_index');
$event->setResponse(new RedirectResponse($url));
}
}
Спасибо, ребята, это работает для меня !! : D
Привет, Vyctoyra, это хорошая идея, но когда я это делаю, у меня появляется ошибка кода состояния 302 Неустранимая ошибка: Uncaught RuntimeException: ошибка при рендеринге «127.0.0.1:8000/fr/page1» (код состояния 302). Может быть, это из-за того, что я визуализирую некоторую форму действием контроллера? но я не знаю что делать