Symfony: выход из системы в KernelEvents :: CONTROLLER Listener

Есть ли возможность выйти из системы в KernelEvents::CONTROLLER Listener? Если да, то как?

В этом слушателе я беру данные из базы данных и помещаю их в службу. Но если запрос не возвращает данных, я хотел бы добавить флэш-сообщение и выйти из системы. Как этого добиться?

Стоит ли изучать 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
568
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете создать простой маршрут для выхода и настроить его в параметрах безопасности (посмотри). Но если вы настаиваете, это зависит от того, что вы хотите построить. Вы можете создать подписчика на событие kernel.controller.

Как уже упоминалось, слушатель здесьkernel.controller (также известный как KernelEvents :: CONTROLLER) получает уведомление о каждом запросе прямо перед выполнением контроллера. Итак, во-первых, вам нужен способ определить, соответствует ли контроллер требованиям запроса.

use Symfony\Component\Security\Core\SecurityContext;
...
    class LogoutSubscriber implements EventSubscriberInterface
    {
        /**
         * @var SecurityContext
         */
        private $securityContext;

        public function __construct(SecurityContext $securityContext)
        {
            $this->securityContext = $securityContext;
        }

        public function onKernelController(FilterControllerEvent $event)
        {
            $controller = $event->getController();

            if (!is_array($controller)) {
                return;
            }

            if ($controller[0] instanceof YourController) {
                 //Log out only if this method returns false
                 $s = $this->someService->init();
                if (false === $s) {
                    //Then logout here
                    //Pass parameters to the controller
                    //which has logout method to invalidate session
                    //null the token and add Flash message
                    $controller = new SecurityController();
                    $controller->setRouter($this->router);
                    $controller->setSession($this->session);
                    $controller->setTokenStorage($this->tokenStorage);
                    $controller->setTranslator($this->translator);
                    $replacementController = array($controller, 'logout');
                    $event->setController($replacementController);
                }
            }
        }

        public static function getSubscribedEvents()
        {
            return array(
                KernelEvents::CONTROLLER => 'onKernelController',
            );
        }
    }

Если вам нужно больше, чем выйти из системы, просто введите соответствующую зависимость и используйте ее, например, для флэш-сообщений, введите Symfony\Component\HttpFoundation\Session\Session с тегом session. а затем просто позвоните $this->session->getFlashBag()->add('notice', 'You have been successfully been logged out.');

Это решение не работает. Я уже пробовал. Для токена установлено значение null, сеанс недействителен, но Symfony продолжает вызывать контроллер. Но я изменил его так, что просто установил контроллер на контроллер выхода из системы. Спасибо.

Tom 10.01.2019 15:40

Symfony продолжает вызывать контроллер ?? как и как вы это исправили, не могли бы вы просто выложить дейт к моему решению?

famas23 10.01.2019 18:14

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

Tom 10.01.2019 19:12

Хорошо, рад за вас, в любом случае я принял ваше редактирование, желаю, чтобы вы думали, что оно решило вашу проблему или помогло найти ваше решение. Спасибо. Ваше здоровье!

famas23 10.01.2019 20:59

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