<?php
namespace App\EventSubscriber;
use App\Entity\Candidat;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\Security\Http\SecurityEvents;
class LocaleSubscriber implements EventSubscriberInterface
{
// Langue par défaut
private $defaultLocale;
private $manager;
private $params;
/** @var SessionInterface */
private $session;
// public function __construct($defaultLocale = 'fr', ParameterBagInterface $params)
public function __construct(string $defaultLocale, SessionInterface $session, ParameterBagInterface $params, EntityManagerInterface $manager)
{
$this->manager = $manager;
$this->session = $session;
$this->params = $params;
$this->defaultLocale = $params->get('locale');
}
public function onKernelRequest(RequestEvent $event)
{
$request = $event->getRequest();
if (!$request->hasPreviousSession()) {
return;
}
// On vérifie si la langue est passée en paramètre de l'URL
if ($locale = $request->query->get('_locale')) {
$request->setLocale($locale);
} else {
// Sinon on utilise celle de la session
$request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
}
}
/** {@inheritdoc} */
public function onInteractiveLogin(InteractiveLoginEvent $event)
{
$request = $event->getRequest();
$user = $event->getAuthenticationToken()->getUser();
$roles = $user->getRoles();
if (in_array('ROLE_ADMIN', $roles, true) || in_array('ROLE_CONSULTANT', $roles, true) || in_array('ROLE_MANAGER', $roles, true)) {
return;
}
$candidat = $this->manager->getRepository(Candidat::class)->find($user->getId());
$langueJeu = $candidat->getProject()->getJeu()->getLangue();
if (null !== $langueJeu) {
$this->session->set('_locale', $langueJeu);
$request->setLocale($langueJeu);
// } else {
// /** @var Language $language */
// $language = $this->entityManager->getRepository(Language::class)->findOneBy(['defaultLang' => true]);
// $language = $language->getSlug();
//
// $this->session->set('_locale', $language);
// $request->setLocale($language);
}
}
public static function getSubscribedEvents()
{
// return [
// 'LocaleSubscriber' => 'onLocaleSubscriber',
// ];
return [
// must be registered before (i.e. with a higher priority than) the default Locale listener
SecurityEvents::INTERACTIVE_LOGIN => array(array('onInteractiveLogin', 15)),
// On doit définir une priorité élevée
KernelEvents::REQUEST => [['onKernelRequest', 20]],
];
}
}