<?php
namespace App\EventSubscriber;
use App\Entity\AccountPro;
use App\Service\Security;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\Router;
use Symfony\Component\Routing\RouterInterface;
use function in_array;
class AskCertificationSubscriber implements EventSubscriberInterface
{
protected Security $security;
protected Router $router;
public function __construct(Security $security, RouterInterface $router)
{
$this->security = $security;
$this->router = $router;
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::CONTROLLER => 'onKernelController',
];
}
public function onKernelController(ControllerEvent $event): void
{
// Récupère l'utilisateur en session
$user = $this->security->getUser();
// Si aucune session pro n'est montée, on laisse passer
if (!$user instanceof AccountPro) {
return;
}
$controller = \is_array($event->getController()) ? $event->getController()[0] : $event->getController();
// Firewall pour la partie Pro
if (str_starts_with(\get_class($controller), 'App\Controller\Pro\\')) {
$currentRouteName = $event->getRequest()->attributes->get('_route');
if (!$user->isCertified() && $currentRouteName !== 'pro_certification') {
$event->setController(function () {
return new RedirectResponse($this->router->generate('pro_certification'));
});
}
}
}
}