<?php
namespace App\Security;
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 EmailVerifiedChecker implements EventSubscriberInterface
{
const FREE_ROUTE = ['homepage', 'public_page', 'email_unverified','resend_verification','verify_email'];
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();
$isValidation = $this->session->get('email_validation_send');
$currentRoute = $this->requestStack->getCurrentRequest()->get('_route');
if (!$token || $token->getUser()->isAdmin() || in_array($currentRoute, self::FREE_ROUTE)) {
return;
}
if (!$token->getUser()->isVerified() && empty($isValidation)) {
$event->setController(function() {
return new RedirectResponse($this->router->generate('email_unverified'));
});
}
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::CONTROLLER => 'onKernelController',
];
}
}