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