<?php
namespace App\Security;
use App\Entity\User;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class AccountPauseChecker implements EventSubscriberInterface
{
const FREE_ROUTE = ['homepage', 'public_page','logout'];
private TokenStorageInterface $token;
private FlashBagInterface $session;
private RequestStack $requestStack;
private RouterInterface $router;
public function __construct(
TokenStorageInterface $token,
FlashBagInterface $session,
RequestStack $requestStack,
RouterInterface $router
) {
$this->token = $token;
$this->session = $session;
$this->requestStack = $requestStack;
$this->router = $router;
}
public function onKernelController(ControllerEvent $event)
{
$token = $this->token->getToken();
$currentRoute = $this->requestStack->getCurrentRequest()->get('_route');
if (!$token || $token->getUser()->isAdmin() || in_array($currentRoute, self::FREE_ROUTE)) {
return;
}
/* @var User $user */
$user = $token->getUser();
if ($user->isSociety() && $user->getSociety() != null && $user->getSociety()->isPaused()) {
$event->setController(function() {
$this->session->add('pause_success', 'Votre compte est en pause');
return new RedirectResponse($this->router->generate('homepage'));
});
}
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::CONTROLLER => 'onKernelController',
];
}
}