<?php
namespace App\Http\Language\Controller;
use App\Domain\User\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\RouterInterface;
#[Route('/switch-language/{language}', name: 'language_switcher', requirements: ['_locale' => 'en|fr'])]
class ChangeLanguageController extends AbstractController
{
public function __invoke(string $language,
Request $request,
RouterInterface $router,
EntityManagerInterface $entityManager): Response
{
/** @var ?User $user */
$user = $this->getUser();
$referer = $request->headers->get('referer');
$request->getSession()->set('_locale', $language);
if (is_null($referer)) {
return $this->redirectToRoute('customer_dashboard');
}
try {
$lastPath = str_replace($request->getSchemeAndHttpHost(), '', $referer);
$lastRoute = strtok($lastPath, '?');
$matcher = $router->getMatcher();
$lastParams = $matcher->match($lastRoute);
$lastRoute = $lastParams['_route'];
$params = array_filter($lastParams, function ($key) {
return !str_starts_with($key, '_');
}, ARRAY_FILTER_USE_KEY);
/** @var string $firstPart */
$firstPart = strstr($lastPath, '?');
$routeParams = substr($firstPart, 1);
parse_str($routeParams, $routeParamsAsArray);
if(!is_null($user)) {
$user->setLanguage($language);
$entityManager->flush();
}
return new RedirectResponse($router->generate($lastRoute, array_merge([
'_locale' => $language,
], $params, $routeParamsAsArray)));
} catch (Exception $e) {
return new RedirectResponse($referer);
}
}
}