[HttpKernel] Reset router locale to default when finishing main request

This commit is contained in:
Guillaume VDP
2026-03-16 16:19:17 +01:00
committed by Nicolas Grekas
parent 3e6a53ddcc
commit d70f4c2bd5
2 changed files with 41 additions and 6 deletions

View File

@@ -47,6 +47,7 @@ class LocaleListener implements EventSubscriberInterface
public function setDefaultLocale(KernelEvent $event): void
{
$event->getRequest()->setDefaultLocale($this->defaultLocale);
$this->setRouterLocale($this->defaultLocale);
}
public function onKernelRequest(RequestEvent $event): void
@@ -54,14 +55,12 @@ class LocaleListener implements EventSubscriberInterface
$request = $event->getRequest();
$this->setLocale($request);
$this->setRouterContext($request);
$this->setRouterLocale($request->getLocale());
}
public function onKernelFinishRequest(FinishRequestEvent $event): void
{
if (null !== $parentRequest = $this->requestStack->getParentRequest()) {
$this->setRouterContext($parentRequest);
}
$this->setRouterLocale($this->requestStack->getParentRequest()?->getLocale() ?? $this->defaultLocale);
}
private function setLocale(Request $request): void
@@ -76,9 +75,9 @@ class LocaleListener implements EventSubscriberInterface
}
}
private function setRouterContext(Request $request): void
private function setRouterLocale(string $locale): void
{
$this->router?->getContext()->setParameter('_locale', $request->getLocale());
$this->router?->getContext()->setParameter('_locale', $locale);
}
public static function getSubscribedEvents(): array

View File

@@ -22,6 +22,7 @@ use Symfony\Component\HttpKernel\EventListener\LocaleListener;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\RequestContextAwareInterface;
use Symfony\Component\Routing\Router;
class LocaleListenerTest extends TestCase
@@ -233,6 +234,41 @@ class LocaleListenerTest extends TestCase
$this->assertEquals('it', $request->getLocale());
}
public function testFinishRequestWithNoParentResetsRouterContextToDefault()
{
$context = new RequestContext();
$router = $this->createStub(RequestContextAwareInterface::class);
$router->method('getContext')->willReturn($context);
$request = Request::create('/');
$request->attributes->set('_locale', 'en');
$listener = new LocaleListener($this->requestStack, 'fr', $router);
$listener->onKernelRequest($this->getEvent($request));
$this->assertSame('en', $context->getParameter('_locale'));
$this->requestStack->method('getParentRequest')->willReturn(null);
$event = new FinishRequestEvent($this->createStub(HttpKernelInterface::class), $request, HttpKernelInterface::MAIN_REQUEST);
$listener->onKernelFinishRequest($event);
$this->assertSame('fr', $context->getParameter('_locale'));
}
public function testSetDefaultLocaleSetsRouterContext()
{
$context = new RequestContext();
$router = $this->createStub(RequestContextAwareInterface::class);
$router->method('getContext')->willReturn($context);
$listener = new LocaleListener($this->requestStack, 'fr', $router);
$request = Request::create('/');
$event = $this->getEvent($request);
$listener->setDefaultLocale($event);
$this->assertSame('fr', $context->getParameter('_locale'));
}
private function getEvent(Request $request): RequestEvent
{
return new RequestEvent($this->createStub(HttpKernelInterface::class), $request, HttpKernelInterface::MAIN_REQUEST);