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




Вы можете создать простой маршрут для выхода и настроить его в параметрах безопасности (посмотри).
Но если вы настаиваете, это зависит от того, что вы хотите построить. Вы можете создать подписчика на событие 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.');
Symfony продолжает вызывать контроллер ?? как и как вы это исправили, не могли бы вы просто выложить дейт к моему решению?
Не знаю как, но это случилось. Вызван контроллер. Конечно, когда я обновился, я был перенаправлен на страницу входа в систему, но перенаправление должно быть выполнено немедленно. Я исправил это как при редактировании вашего предложения.
Хорошо, рад за вас, в любом случае я принял ваше редактирование, желаю, чтобы вы думали, что оно решило вашу проблему или помогло найти ваше решение. Спасибо. Ваше здоровье!
Это решение не работает. Я уже пробовал. Для токена установлено значение null, сеанс недействителен, но Symfony продолжает вызывать контроллер. Но я изменил его так, что просто установил контроллер на контроллер выхода из системы. Спасибо.