src/EventSubscriber/LocaleSubscriber.php line 55

Open in your IDE?
  1. <?php
  2. namespace Acme\SudcmsBundle\EventSubscriber;
  3. use Acme\SudcmsBundle\Repository\AuthUserRepository;
  4. use Acme\SudcmsBundle\Repository\SiteLangRepository;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Symfony\Component\HttpFoundation\RequestStack;
  9. use Symfony\Component\HttpKernel\Event\RequestEvent;
  10. use Symfony\Component\HttpKernel\KernelEvents;
  11. use Symfony\Component\Security\Core\Security;
  12. use Twig\Environment;
  13. class LocaleSubscriber implements EventSubscriberInterface {
  14.     private $session       null;
  15.     private $siteLangRepository;
  16.     private $currentSitUid null;
  17.     private $parameterBag;
  18.     private $twig;
  19.     private $request       null;
  20.     private $defaultLocale;
  21.     private $requestStack;
  22.     private $usersRepository;
  23.     private $security;
  24.     private $entityManager;
  25.     public function __construct(string                $defaultLocaleEntityManagerInterface $entityManager,
  26.                                 RequestStack          $requestStackSiteLangRepository $siteLangRepository,
  27.                                 ParameterBagInterface $parameterBagEnvironment $twigAuthUserRepository $repoUser,
  28.                                 Security              $security) {
  29.         $this->siteLangRepository $siteLangRepository;
  30.         $this->repoUser $repoUser;
  31.         $this->parameterBag $parameterBag;
  32.         $this->twig $twig;
  33.         $this->security $security;
  34.         $this->entityManager $entityManager;
  35.         $this->defaultLocale $defaultLocale;
  36.         $this->requestStack $requestStack;
  37.     }
  38.     public static function getSubscribedEvents() {
  39.         return [
  40.             // must be registered before (i.e. with a higher priority than) the default Locale listener
  41.             KernelEvents::REQUEST => [['onKernelRequest'20]],
  42.         ];
  43.     }
  44.     public function onKernelRequest(RequestEvent $event) {
  45.         $this->request $request $event->getRequest();
  46.         $this->session $request->getSession();
  47.         if (!$request->hasPreviousSession()) {
  48.             return;
  49.         }
  50.         // permet de savoir si on est en bo ou front
  51.         $args explode("/"$this->request->getPathInfo());
  52.         // clean the path values
  53.         foreach ($args as $key => $arg) {
  54.             if (trim($arg) == "")
  55.                 unset($args[$key]);
  56.         }
  57.         // récupération de l'identifiant du site
  58.         $args array_values($args);
  59.         if (isset($args[0]) && $args[0] === "admin") {
  60.             $this->currentSitUid $this->session->get('admin_site_uid'1);
  61.         } else {
  62.             $domain explode("."$this->request->getHost());
  63.             //            if (is_array($domain) && isset($domain[1]) && $domain[0] != '127') {
  64.             //                $this->currentSitUid = $this->parameterBag->get($domain[0]);
  65.             //            } else {
  66.             //                $this->currentSitUid = $this->parameterBag->get('DEFAULT_ID');
  67.             //            }
  68.             $this->currentSitUid $this->parameterBag->get('DEFAULT_ID');
  69.         }
  70.         //        dd($this->currentSitUid);
  71.         if (!defined('CURRENT_SITE_ID')) {
  72.             define('CURRENT_SITE_ID'$this->currentSitUid);
  73.         }
  74.         // Choix de la BDD
  75.         //DOC : https://karoldabrowski.com/blog/dynamic-database-connection-based-on-request-symfony-and-doctrine/
  76.         //        $connection = $this->entityManager->getConnection();
  77.         //
  78.         //        if(!$connection instanceof MultiDbConnectionWrapper) {
  79.         //            throw new \RuntimeException('Wrong connection');
  80.         //        }
  81.         //        $connection->selectDatabase($this->parameterBag->get('SITE'.$this->currentSitUid.'_DB'));
  82.         //
  83.         //        // try to see if the locale has been set as a _locale routing parameter
  84.         if ($locale $request->query->get('_locale')) {
  85.             $request->getSession()->set('_locale'$locale);
  86.             $request->setLocale($locale);
  87.         } else {
  88.             // if no explicit locale has been set on this request, use one from the session
  89.             $request->setLocale($request->getSession()->get('_locale'$this->defaultLocale));
  90.         }
  91.         // vérification que la langue soit autorisée
  92.         $this->CheckLanguageSite();
  93.     }
  94.     private function CheckLanguageSite() {
  95.         $languagesBySite $this->siteLangRepository->getAllLanguagesBySite($this->currentSitUid);
  96.         $langCodeActiveBack $langCodeActiveFront = [];
  97.         $langCodeActiveBackFlag $langCodeActiveFrontFlag = [];
  98.         // récupération des langues pour le front et le back
  99.         foreach ($languagesBySite as $lng) {
  100.             // langue pour le back
  101.             if ($lng['lang_active_back'] == && !in_array($lng['lang_code'], $langCodeActiveBack)) {
  102.                 $langCodeActiveBack [] = $lng;
  103.                 $langCodeActiveBackFlag [] = $lng["lang_code"];
  104.             }
  105.             // langues pour le front
  106.             if ($lng['lang_active'] == && !in_array($lng['lang_code'], $langCodeActiveFront)) {
  107.                 $langCodeActiveFront [] = $lng;
  108.                 $langCodeActiveFrontFlag [] = $lng["lang_code"];
  109.             }
  110.         }
  111.         // ----- ADMIN -----
  112.         // récupère la première langue dispo si la lange n'est pas présente
  113.         if (!$this->session->has('admin_site_lang')) {
  114.             $this->session->set('admin_site_lang'$langCodeActiveBack[0]['lang_code']);
  115.         }
  116.         // récupère la première langue dispo si la lange n'est pas autorisée
  117.         if (!in_array($this->session->get('admin_site_lang'), $langCodeActiveBackFlag)) {
  118.             $this->session->set('admin_site_lang'$langCodeActiveBack[0]['lang_code']);
  119.         }
  120.         $this->twig->addGlobal("languesActivesBack"$langCodeActiveBack);
  121.         // ------
  122.         // ----- FRONT -----
  123.         // récupère la première langue dispo si la lange n'est pas autorisée
  124.         if (!in_array($this->request->getLocale(), $langCodeActiveFrontFlag)) {
  125.             $this->request->getSession()->set('_locale'$langCodeActiveFront[0]['lang_code']);
  126.             $this->request->setLocale($langCodeActiveFront[0]['lang_code']);
  127.             $this->langueFront $langCodeActiveFront[0]['lang_code'];
  128.         }
  129.         $this->twig->addGlobal("languesActives"$langCodeActiveFront);
  130.         // ------
  131.     }
  132. }