Symfony: выход из системы в KernelEvents :: CONTROLLER Listener - PullRequest
0 голосов
/ 09 января 2019

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

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

1 Ответ

0 голосов
/ 10 января 2019

Вы можете создать простой маршрут для выхода из системы и настроить его в параметрах безопасности ( посмотрите ). Но если вы настаиваете, это зависит от того, что вы хотите построить. Вы можете создать подписчика на событие 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.');

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...