<?php
/*
* This file is part of the nellapp-core package.
*
* (c) Benjamin Georgeault
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace App\EventSubscriber;
use App\Entity\Account\User;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Http\Event\LogoutEvent;
/**
* Class LogoutSubscriber
*
* @author Benjamin Georgeault
*/
class LogoutSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
LogoutEvent::class => 'logout',
];
}
public function logout(LogoutEvent $event): void
{
if (null === $this->getUser($event->getToken())) {
return;
}
$request = $event->getRequest();
if (!$request->query->has('target')) {
return;
}
if (!filter_var($target = $request->query->get('target'), FILTER_VALIDATE_URL)) {
return;
}
$event->setResponse(new RedirectResponse($target));
}
private function getUser(TokenInterface $token): ?User
{
if (($user = $token->getUser()) instanceof User) {
return $user;
}
return null;
}
}