mirror of
https://github.com/symfony/symfony.git
synced 2026-03-24 00:32:15 +01:00
[HttpKernel] Reset router locale to default when finishing main request
This commit is contained in:
committed by
Nicolas Grekas
parent
3e6a53ddcc
commit
d70f4c2bd5
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user