<?php
namespace App\EventSubscriber;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Http\Event\LoginSuccessEvent;
class LocaleSubscriber implements EventSubscriberInterface
{
private const DEFAULT_LOCALE = 'fr';
private const LOCALES_AUTORISES = ['fr', 'en'];
public function __construct(
private readonly Security $security,
) {}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => ['onKernelRequest', 100],
LoginSuccessEvent::class => ['onLoginSuccess', 10],
];
}
// ── Sur chaque requête ───────────────────────────────────────────
public function onKernelRequest(RequestEvent $event): void
{
$request = $event->getRequest();
$locale = self::DEFAULT_LOCALE;
// 1. Utilisateur connecté → priorité à la locale en base
$user = $this->security->getUser();
if ($user && method_exists($user, 'getLocale') && $user->getLocale()) {
$locale = $user->getLocale();
}
// 2. Session
elseif ($request->hasSession() && $request->getSession()->has('_locale')) {
$locale = $request->getSession()->get('_locale');
}
// 3. Cookie
elseif ($request->cookies->has('_locale')) {
$locale = $request->cookies->get('_locale');
}
// Sécurité : locale autorisée uniquement
if (!in_array($locale, self::LOCALES_AUTORISES, true)) {
$locale = self::DEFAULT_LOCALE;
}
$request->setLocale($locale);
}
// ── À la connexion : synchroniser session + cookie ───────────────
public function onLoginSuccess(LoginSuccessEvent $event): void
{
$user = $event->getUser();
$request = $event->getRequest();
$locale = self::DEFAULT_LOCALE;
if (method_exists($user, 'getLocale') && $user->getLocale()) {
$locale = $user->getLocale();
}
if (!in_array($locale, self::LOCALES_AUTORISES, true)) {
$locale = self::DEFAULT_LOCALE;
}
// Synchroniser session avec la locale en base
$request->getSession()->set('_locale', $locale);
}
}