src/EventSubscriber/UserSubscriber.php line 148
<?php
namespace App\EventSubscriber;
use App\Entity\AppConstants;
use App\Entity\Inscription;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\Security\Http\Event\LoginFailureEvent;
use Symfony\Component\Security\Http\Event\LoginSuccessEvent;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Http\Event\LogoutEvent;
class UserSubscriber implements EventSubscriberInterface
{
private ParameterBagInterface $parameterBag;
private EntityManagerInterface $em;
private UrlGeneratorInterface $urlGenerator;
public function __construct(ParameterBagInterface $parameterBag, EntityManagerInterface $em, UrlGeneratorInterface $urlGenerator)
{
$this->parameterBag = $parameterBag;
$this->em = $em;
$this->urlGenerator = $urlGenerator;
}
public static function getSubscribedEvents(): array
{
return [
// KernelEvents::REQUEST => 'onKernelRequest',
// KernelEvents::RESPONSE => 'onKernelResponse',
InteractiveLoginEvent::class => 'onInteractiveLogin',
// LoginSuccessEvent::class => 'onLoginSuccess',
// LoginFailureEvent::class => 'onFailureSuccess',
LogoutEvent::class => 'onLogout'
];
}
public function onInteractiveLogin(InteractiveLoginEvent $event): void
{
/** @var User $user */
$user = null;
if ($event->getAuthenticationToken()) {
$user = $event->getAuthenticationToken()->getUser();
}
/** @var User $user */
if ($user) {
$user->setLastLoginAt(new \DateTime());
$this->em->persist($user);
$this->em->flush();
/** @var SessionInterface $session */
$session = null;
if ($user->hasRole(User::ROLE_MEMBER) && $event->getRequest() && $session = $event->getRequest()->getSession()) {
$inscription_reference = null;
if ($session->has(AppConstants::SESSION_INSCRIPTION_REFERENCE) && $inscription_reference = $session->get(AppConstants::SESSION_INSCRIPTION_REFERENCE)) {
if ($inscription_reference) {
/** @var Inscription $inscription */
$inscription = $this->em->getRepository(Inscription::class)->findOneBy(['reference' => $inscription_reference]);
if ($inscription && empty($inscription->getUser())) {
$inscription->setUser($user);
$this->em->persist($inscription);
$this->em->flush();
$session->remove(AppConstants::SESSION_INSCRIPTION_REFERENCE);
}
}
}
}
}
if (function_exists('dump')) :
// dump(@compact('event', 'user'));
endif;
}
/*
public function onLoginSuccess(LoginSuccessEvent $event)
{
/ ** @var User $user * /
$user = $event->getUser();
$request = $event->getRequest();
$session = $request->getSession();
if ($user->hasRole(User::ROLE_MEMBER)) {
// dd(@compact('request'));
$response = $event->getResponse();
if ($request->attributes->get('_route') === 'app_user_login') {
if ($session && $session->has(AppConstants::SESSION_INSCRIPTION_REFERENCE) && $session->get(AppConstants::SESSION_INSCRIPTION_REFERENCE)) {
$response = $this->guardHandler
->authenticateUserAndHandleSuccess(
$user,
$event->getRequest(),
$this->authenticator,
// $event->getAuthenticator(),
'member_area'
);
}
}
// $event->setResponse($response);
}
$this->em->flush();
//dd($user);
}
*/
/*
public function onFailureSuccess(LoginFailureEvent $event)
{
$request = $event->getRequest();
}
*/
/*
public function onKernelRequest(RequestEvent $event): void
{
if (!$event->isMainRequest()) {
// don't do anything if it's not the main request
return;
}
if (function_exists('dump')) :
// dump(@compact('event'));
endif;
}
public function onKernelResponse(ResponseEvent $event): void
{
if (function_exists('dump')) :
// dump(@compact('event'));
endif;
}
*/
public function onLogout(LogoutEvent $event): void
{
// get the security token of the session that is about to be logged out
// $token = $event->getToken();
// get the current request
$request = $event->getRequest();
if ($session = $request->getSession()) {
if ($session->has(AppConstants::SESSION_EVENEMENT_REFERENCE)) {
$session->remove(AppConstants::SESSION_EVENEMENT_REFERENCE);
}
if ($session->has(AppConstants::SESSION_INSCRIPTION_REFERENCE)) {
$session->remove(AppConstants::SESSION_INSCRIPTION_REFERENCE);
}
}
// get the current response, if it is already set by another listener
$response = $event->getResponse();
// configure a custom logout response to the homepage
$response = new RedirectResponse(
$this->urlGenerator->generate('app_user_login'),
RedirectResponse::HTTP_SEE_OTHER
);
$event->setResponse($response);
}
}