<?php
namespace AppBundle\Security;
use AppBundle\Entity\Customer;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\RequestEvent;
/**
* Do some redirects on certain pages if user is logged in.
*/
class RedirectUserIfAuthenticatedEventSubscriber implements \Symfony\Component\EventDispatcher\EventSubscriberInterface
{
private $tokenStorage;
private $router;
public function __construct(TokenStorageInterface $t, RouterInterface $r)
{
$this->tokenStorage = $t;
$this->router = $r;
}
public function onKernelRequest(RequestEvent $event): void
{
if ($this->isUserLogged() && $event->isMainRequest()) {
$currentRoute = $event->getRequest()->attributes->get('_route');
if ($this->isAuthenticatedUserOnAnonymousPage($currentRoute)) {
$response = new RedirectResponse($this->router->generate('dashboard'));
$event->setResponse($response);
}
}
}
private function isUserLogged(): bool
{
$user = $this->tokenStorage?->getToken()?->getUser();
return $user instanceof Customer;
}
private function isAuthenticatedUserOnAnonymousPage(string $currentRoute): bool
{
return in_array(
$currentRoute,
['login', 'reset', 'register', 'confirm']
);
}
public static function getSubscribedEvents(): array
{
return [KernelEvents::REQUEST => 'onKernelRequest'];
}
}