8000 properly handle exceptions in translator listener · matthieuauger/symfony@d3a0a55 · GitHub
[go: up one dir, main page]

Skip to content

Commit d3a0a55

Browse files
committed
properly handle exceptions in translator listener
The `setLocale()` method can throw an `\InvalidArgumentException` when an invalid locale has been passed. These exceptions must be handled by the `TranslatorListener` which should then pass the request's default locale instead.
1 parent 46d18f4 commit d3a0a55

File tree

2 files changed

+46
-3
lines changed

2 files changed

+46
-3
lines changed

src/Symfony/Component/HttpKernel/EventListener/TranslatorListener.php

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\HttpKernel\EventListener;
1313

1414
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
15+
use Symfony\Component\HttpFoundation\Request;
1516
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
1617
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
1718
use Symfony\Component\HttpKernel\KernelEvents;
@@ -36,14 +37,16 @@ public function __construct(TranslatorInterface $translator, RequestStack $reque
3637

3738
public function onKernelRequest(GetResponseEvent $event)
3839
{
39-
$this->translator->setLocale($event->getRequest()->getLocale());
40+
$this->setLocale($event->getRequest());
4041
}
4142

4243
public function onKernelFinishRequest(FinishRequestEvent $event)
4344
{
44-
if (null !== $parentRequest = $this->requestStack->getParentRequest()) {
45-
$this->translator->setLocale($parentRequest->getLocale());
45+
if (null === $parentRequest = $this->requestStack->getParentRequest()) {
46+
return;
4647
}
48+
49+
$this->setLocale($parentRequest);
4750
}
4851

4952
public static function getSubscribedEvents()
@@ -54,4 +57,13 @@ public static function getSubscribedEvents()
5457
KernelEvents::FINISH_REQUEST => array(array('onKernelFinishRequest', 0)),
5558
);
5659
}
60+
61+
private function setLocale(Request $request)
62+
{
63+
try {
64+
$this->translator->setLocale($request->getLocale());
65+
} catch (\InvalidArgumentException $e) {
66+
$this->translator->setLocale($request->getDefaultLocale());
67+
}
68+
}
5769
}

src/Symfony/Component/HttpKernel/Tests/EventListener/TranslatorListenerTest.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,21 @@ public function testLocaleIsSetInOnKernelRequest()
4141
$this->listener->onKernelRequest($event);
4242
}
4343

44+
public function testDefaultLocaleIsUsedOnExceptionsInOnKernelRequest()
45+
{
46+
$this->translator
47+
->expects($this->at(0))
48+
->method('setLocale')
49+
->will($this->throwException(new \InvalidArgumentException()));
50+
$this->translator
51+
->expects($this->at(1))
52+
->method('setLocale')
53+
->with($this->equalTo('en'));
54+
55+
$event = new GetResponseEvent($this->createHttpKernel(), $this->createRequest('fr'), HttpKernelInterface::MASTER_REQUEST);
56+
$this->listener->onKernelRequest($event);
57+
}
58+
4459
public function testLocaleIsSetInOnKernelFinishRequestWhenParentRequestExists()
4560
{
4661
$this->translator
@@ -63,6 +78,22 @@ public function testLocaleIsNotSetInOnKernelFinishRequestWhenParentRequestDoesNo
6378
$this->listener->onKernelFinishRequest($event);
6479
}
6580

81+
public function testDefaultLocaleIsUsedOnExceptionsInOnKernelFinishRequest()
82+
{
83+
$this->translator
84+
->expects($this->at(0))
85+
->method('setLocale')
86+
->will($this->throwException(new \InvalidArgumentException()));
87+
$this->translator
88+
->expects($this->at(1))
89+
->method('setLocale')
90+
->with($this->equalTo('en'));
91+
92+
$this->setMasterRequest($this->createRequest('fr'));
93+
$event = new FinishRequestEvent($this->createHttpKernel(), $this->createRequest('de'), HttpKernelInterface::SUB_REQUEST);
94+
$this->listener->onKernelFinishRequest($event);
95+
}
96+
6697
private function createHttpKernel()
6798
{
6899
return $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');

0 commit comments

Comments
 (0)
0