Symfony:退出KernelEvents :: CONTROLLER侦听器

时间:2019-01-09 20:09:29

标签: symfony

是否可以在KernelEvents::CONTROLLER侦听器中注销用户? 如果是,怎么办?

在此侦听器中,我从数据库中获取了一些数据并将其放入服务中。但是,如果查询未返回任何数据,则我想添加一条即时消息并注销用户。 如何实现呢?

1 个答案:

答案 0 :(得分:1)

您可以创建一个简单的登出路由,并在安全性参数(take a look)下对其进行配置。 但是,如果您坚持要取决于您要构建的内容。您可以为kernel.controller事件创建事件订阅者。

正如提到的 here kernel.controller(aka 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的{​​{1}} 然后只需致电session