<?php
namespace App\EventListener;
use App\Entity\User;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Http\Event\LogoutEvent;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
class LogoutSubscriber implements EventSubscriberInterface
{
private UrlGeneratorInterface $urlGenerator;
private FlashBagInterface $flash;
public function __construct(
UrlGeneratorInterface $urlGenerator,
FlashBagInterface $flash
) {
$this->urlGenerator = $urlGenerator;
$this->flash = $flash;
}
public static function getSubscribedEvents(): array
{
return [LogoutEvent::class => 'onLogout'];
}
public function onLogout(LogoutEvent $event): void
{
// get the security token of the session that is about to be logged out
$token = $event->getToken();
/** @var \App\Entity\User */
$user = $token->getUser();
if ($user->getSubscriptionActive() || in_array('ROLE_ADMIN', $user->getRoles())) {
return;
}
// get the current request
$request = $event->getRequest();
// get the current response, if it is already set by another listener
$response = $event->getResponse();
$this->flash->add(
'notice',
'Your membership has expired. Please renew it by contacting us'
);
// configure a custom logout response to the homepage
$response = new RedirectResponse(
$this->urlGenerator->generate('app_login'),
RedirectResponse::HTTP_SEE_OTHER
);
$event->setResponse($response);
}
}