src/EventSubscriber/LocaleSubscriber.php line 57

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use Symfony\Component\Security\Core\Security;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpKernel\Event\RequestEvent;
  6. use Symfony\Component\HttpKernel\KernelEvents;
  7. use Symfony\Component\Security\Http\Event\LoginSuccessEvent;
  8. class LocaleSubscriber implements EventSubscriberInterface
  9. {
  10. private const DEFAULT_LOCALE = 'fr';
  11. private const LOCALES_AUTORISES = ['fr', 'en'];
  12. public function __construct(
  13. private readonly Security $security,
  14. ) {}
  15. public static function getSubscribedEvents(): array
  16. {
  17. return [
  18. KernelEvents::REQUEST => ['onKernelRequest', 100],
  19. LoginSuccessEvent::class => ['onLoginSuccess', 10],
  20. ];
  21. }
  22. // ── Sur chaque requête ───────────────────────────────────────────
  23. public function onKernelRequest(RequestEvent $event): void
  24. {
  25. $request = $event->getRequest();
  26. $locale = self::DEFAULT_LOCALE;
  27. // 1. Utilisateur connecté → priorité à la locale en base
  28. $user = $this->security->getUser();
  29. if ($user && method_exists($user, 'getLocale') && $user->getLocale()) {
  30. $locale = $user->getLocale();
  31. }
  32. // 2. Session
  33. elseif ($request->hasSession() && $request->getSession()->has('_locale')) {
  34. $locale = $request->getSession()->get('_locale');
  35. }
  36. // 3. Cookie
  37. elseif ($request->cookies->has('_locale')) {
  38. $locale = $request->cookies->get('_locale');
  39. }
  40. // Sécurité : locale autorisée uniquement
  41. if (!in_array($locale, self::LOCALES_AUTORISES, true)) {
  42. $locale = self::DEFAULT_LOCALE;
  43. }
  44. $request->setLocale($locale);
  45. }
  46. // ── À la connexion : synchroniser session + cookie ───────────────
  47. public function onLoginSuccess(LoginSuccessEvent $event): void
  48. {
  49. $user = $event->getUser();
  50. $request = $event->getRequest();
  51. $locale = self::DEFAULT_LOCALE;
  52. if (method_exists($user, 'getLocale') && $user->getLocale()) {
  53. $locale = $user->getLocale();
  54. }
  55. if (!in_array($locale, self::LOCALES_AUTORISES, true)) {
  56. $locale = self::DEFAULT_LOCALE;
  57. }
  58. // Synchroniser session avec la locale en base
  59. $request->getSession()->set('_locale', $locale);
  60. }
  61. }