Symfony 3.4 перенаправляет пользователя на страницу в зависимости от его статуса

Цель: перенаправить пользователя в зависимости от статуса на весь сайт, когда пользователь вошел в систему.

Мне нужно заставить пользователя находиться на одной странице, пока он не изменит свой профиль Итак, я пытаюсь сделать перенаправление с помощью ядра событий, но у меня бесконечный цикл. однако я пытался избежать этого перенаправления, когда страница хотела

Итак, пожалуйста, найдите то, что я пытаюсь сделать

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',
        );
    }

}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
0
280
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете попробовать это, но использование -> get ('_ route') обычно должно использоваться только для отладки. Вы должны сбросить событие и ответ, чтобы узнать, что еще вы можете использовать.

public function onKernelRequest(GetResponseEvent $event)
    if ($event->getRequest()->get('_route') != 'user_index'){
        $event->setResponse(new Response('[NOT_ALLOWED]'));
    }
}

Привет, Vyctoyra, это хорошая идея, но когда я это делаю, у меня появляется ошибка кода состояния 302 Неустранимая ошибка: Uncaught RuntimeException: ошибка при рендеринге «127.0.0.1:8000/fr/page1» (код состояния 302). Может быть, это из-за того, что я визуализирую некоторую форму действием контроллера? но я не знаю что делать

iometrine 17.10.2018 11:21

Может нужно вернуть редирект? $ event-> setResponse (новый RedirectResponse ('user_index'));

Vyctorya 17.10.2018 12:14

это то, что я сделал, но у меня всегда бесконечный цикл

iometrine 17.10.2018 12:18

Что вы получите от var_dump ($ event-> getRequest () -> get ('_ route')); умереть();

Vyctorya 17.10.2018 12:20

у меня есть ноль

iometrine 17.10.2018 14:07

Это должно решить вашу проблему

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;
    }
}

спасибо, но это не работает. Я все еще в бесконечном цикле

iometrine 17.10.2018 16:16
Ответ принят как подходящий

Теперь перенаправление работает, но когда страница загружается, все мои 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

Crown Backend 22.03.2021 21:22

Другие вопросы по теме