src/Http/Language/Controller/ChangeLanguageController.php line 16

Open in your IDE?
  1. <?php
  2. namespace App\Http\Language\Controller;
  3. use App\Domain\User\Entity\User;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Exception;
  6. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  7. use Symfony\Component\HttpFoundation\RedirectResponse;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use Symfony\Component\Routing\RouterInterface;
  12. #[Route('/switch-language/{language}'name'language_switcher'requirements: ['_locale' => 'en|fr'])]
  13. class ChangeLanguageController extends AbstractController
  14. {
  15.     public function __invoke(string $language,
  16.                              Request $request,
  17.                              RouterInterface $router,
  18.                              EntityManagerInterface $entityManager): Response
  19.     {
  20.         /** @var ?User $user */
  21.         $user $this->getUser();
  22.         $referer $request->headers->get('referer');
  23.         $request->getSession()->set('_locale'$language);
  24.         if (is_null($referer)) {
  25.             return $this->redirectToRoute('customer_dashboard');
  26.         }
  27.         try {
  28.             $lastPath str_replace($request->getSchemeAndHttpHost(), ''$referer);
  29.             $lastRoute strtok($lastPath'?');
  30.             $matcher $router->getMatcher();
  31.             $lastParams $matcher->match($lastRoute);
  32.             $lastRoute $lastParams['_route'];
  33.             $params array_filter($lastParams, function ($key) {
  34.                 return !str_starts_with($key'_');
  35.             }, ARRAY_FILTER_USE_KEY);
  36.             /** @var string $firstPart */
  37.             $firstPart strstr($lastPath'?');
  38.             $routeParams substr($firstPart1);
  39.             parse_str($routeParams$routeParamsAsArray);
  40.             if(!is_null($user)) {
  41.                 $user->setLanguage($language);
  42.                 $entityManager->flush();
  43.             }
  44.             return new RedirectResponse($router->generate($lastRoutearray_merge([
  45.                 '_locale' => $language,
  46.             ], $params$routeParamsAsArray)));
  47.         } catch (Exception $e) {
  48.             return new RedirectResponse($referer);
  49.         }
  50.     }
  51. }