Skip to content

Commit 266f0f3

Browse files
[HttpKernel] Add request attribute _handle_all_throwables to allow HttpKernel to handle thrown Error in addition to Exception
1 parent 5c7d554 commit 266f0f3

10 files changed

+19
-26
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ CHANGELOG
44
6.2
55
---
66

7-
* Add constructor argument `bool $catchThrowable` to `HttpKernel`
7+
* Add constructor argument `bool $handleAllThrowable` to `HttpKernel`
88
* Add `ControllerEvent::getAttributes()` to handle attributes on controllers
99
* Add `#[Cache]` to describe the default HTTP cache headers on controllers
1010
* Add `absolute_uri` option to surrogate fragment renderers

HttpKernel.php

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,18 +54,15 @@ class HttpKernel implements HttpKernelInterface, TerminableInterface
5454
protected $resolver;
5555
protected $requestStack;
5656
private ArgumentResolverInterface $argumentResolver;
57-
private bool $catchThrowable;
57+
private bool $handleAllThrowables;
5858

59-
public function __construct(EventDispatcherInterface $dispatcher, ControllerResolverInterface $resolver, RequestStack $requestStack = null, ArgumentResolverInterface $argumentResolver = null, bool $catchThrowable = false)
59+
public function __construct(EventDispatcherInterface $dispatcher, ControllerResolverInterface $resolver, RequestStack $requestStack = null, ArgumentResolverInterface $argumentResolver = null, bool $handleAllThrowables = false)
6060
{
6161
$this->dispatcher = $dispatcher;
6262
$this->resolver = $resolver;
6363
$this->requestStack = $requestStack ?? new RequestStack();
6464
$this->argumentResolver = $argumentResolver ?? new ArgumentResolver();
65-
$this->catchThrowable = $catchThrowable;
66-
if (!$catchThrowable) {
67-
trigger_deprecation('symfony/http-kernel', '6.2', 'Starting from 7.0, "%s::handle()" will catch \Throwable exceptions and convert them to HttpFoundation responses. Pass $catchThrowable=true to adapt to this behavior now.', self::class);
68-
}
65+
$this->handleAllThrowables = $handleAllThrowables;
6966
}
7067

7168
public function handle(Request $request, int $type = HttpKernelInterface::MAIN_REQUEST, bool $catch = true): Response
@@ -76,7 +73,7 @@ public function handle(Request $request, int $type = HttpKernelInterface::MAIN_R
7673
try {
7774
return $this->handleRaw($request, $type);
7875
} catch (\Throwable $e) {
79-
if (!$this->catchThrowable && !$e instanceof \Exception) {
76+
if ($e instanceof \Error && !$this->handleAllThrowables) {
8077
throw $e;
8178
}
8279

@@ -217,8 +214,6 @@ private function finishRequest(Request $request, int $type)
217214

218215
/**
219216
* Handles a throwable by trying to convert it to a Response.
220-
*
221-
* @throws \Throwable
222217
*/
223218
private function handleThrowable(\Throwable $e, Request $request, int $type): Response
224219
{
@@ -251,7 +246,7 @@ private function handleThrowable(\Throwable $e, Request $request, int $type): Re
251246
try {
252247
return $this->filterResponse($response, $request, $type);
253248
} catch (\Throwable $e) {
254-
if (!$this->catchThrowable && !$e instanceof \Exception) {
249+
if ($e instanceof \Error && !$this->handleAllThrowables) {
255250
throw $e;
256251
}
257252

Tests/DataCollector/RequestDataCollectorTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ protected function createResponse()
396396
protected function injectController($collector, $controller, $request)
397397
{
398398
$resolver = $this->createMock(ControllerResolverInterface::class);
399-
$httpKernel = new HttpKernel(new EventDispatcher(), $resolver, null, $this->createMock(ArgumentResolverInterface::class), true);
399+
$httpKernel = new HttpKernel(new EventDispatcher(), $resolver, null, $this->createMock(ArgumentResolverInterface::class));
400400
$event = new ControllerEvent($httpKernel, $controller, $request, HttpKernelInterface::MAIN_REQUEST);
401401
$collector->onKernelController($event);
402402
}

Tests/Debug/TraceableEventDispatcherTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,6 @@ protected function getHttpKernel($dispatcher)
119119
$argumentResolver = $this->createMock(ArgumentResolverInterface::class);
120120
$argumentResolver->expects($this->once())->method('getArguments')->willReturn([]);
121121

122-
return new HttpKernel($dispatcher, $controllerResolver, new RequestStack(), $argumentResolver, true);
122+
return new HttpKernel($dispatcher, $controllerResolver, new RequestStack(), $argumentResolver);
123123
}
124124
}

Tests/EventListener/RouterListenerTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ public function testWithBadRequest()
173173
return new Response('Exception handled', 400);
174174
}));
175175

176-
$kernel = new HttpKernel($dispatcher, new ControllerResolver(), $requestStack, new ArgumentResolver(), true);
176+
$kernel = new HttpKernel($dispatcher, new ControllerResolver(), $requestStack, new ArgumentResolver());
177177

178178
$request = Request::create('http://localhost/');
179179
$request->headers->set('host', '###');
@@ -195,7 +195,7 @@ public function testNoRoutingConfigurationResponse()
195195
$dispatcher = new EventDispatcher();
196196
$dispatcher->addSubscriber(new RouterListener($requestMatcher, $requestStack, new RequestContext()));
197197

198-
$kernel = new HttpKernel($dispatcher, new ControllerResolver(), $requestStack, new ArgumentResolver(), true);
198+
$kernel = new HttpKernel($dispatcher, new ControllerResolver(), $requestStack, new ArgumentResolver());
199199

200200
$request = Request::create('http://localhost/');
201201
$response = $kernel->handle($request);

Tests/Fragment/InlineFragmentRendererTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ public function testExceptionInSubRequestsDoesNotMangleOutputBuffers()
142142
->willReturn([])
143143
;
144144

145-
$kernel = new HttpKernel(new EventDispatcher(), $controllerResolver, new RequestStack(), $argumentResolver, true);
145+
$kernel = new HttpKernel(new EventDispatcher(), $controllerResolver, new RequestStack(), $argumentResolver);
146146
$renderer = new InlineFragmentRenderer($kernel);
147147

148148
// simulate a main request with output buffering

Tests/HttpCache/TestHttpKernel.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public function __construct($body, $status, $headers, \Closure $customizer = nul
3636
$this->headers = $headers;
3737
$this->customizer = $customizer;
3838

39-
parent::__construct($eventDispatcher ?? new EventDispatcher(), $this, null, $this, true);
39+
parent::__construct($eventDispatcher ?? new EventDispatcher(), $this, null, $this);
4040
}
4141

4242
public function assert(\Closure $callback)

Tests/HttpCache/TestMultipleHttpKernel.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public function __construct($responses)
3535
$this->headers[] = $response['headers'];
3636
}
3737

38-
parent::__construct(new EventDispatcher(), $this, null, $this, true);
38+
parent::__construct(new EventDispatcher(), $this, null, $this);
3939
}
4040

4141
public function getBackendRequest()

Tests/HttpKernelTest.php

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public function testHandleWhenControllerThrowsAThrowableAndCatchIsTrueWithAHandl
128128
$event->setResponse(new Response($event->getThrowable()->getMessage()));
129129
});
130130

131-
$kernel = $this->getHttpKernel($dispatcher, function () { throw new \TypeError('foo'); });
131+
$kernel = $this->getHttpKernel($dispatcher, function () { throw new \TypeError('foo'); }, handleAllThrowables: true);
132132
$response = $kernel->handle(new Request(), HttpKernelInterface::MAIN_REQUEST, true);
133133

134134
$this->assertEquals('500', $response->getStatusCode());
@@ -147,7 +147,7 @@ public function testHandleWhenControllerThrowsAThrowableAndCatchIsFalseWithAHand
147147
$event->setResponse(new Response($event->getThrowable()->getMessage()));
148148
});
149149

150-
$kernel = $this->getHttpKernel($dispatcher, function () { throw new \TypeError('foo'); });
150+
$kernel = $this->getHttpKernel($dispatcher, function () { throw new \TypeError('foo'); }, handleAllThrowables: true);
151151
$this->expectException(\TypeError::class);
152152
$kernel->handle(new Request(), HttpKernelInterface::MAIN_REQUEST, false);
153153
}
@@ -156,8 +156,6 @@ public function testHandleWhenControllerThrowsAThrowableAndCatchIsFalseWithAHand
156156
* Catch exceptions: true
157157
* Throwable type: TypeError
158158
* Listener: true.
159-
*
160-
* @group legacy
161159
*/
162160
public function testHandleWhenControllerThrowsAThrowableAndCatchIsTrueNotHandlingThrowables()
163161
{
@@ -178,7 +176,7 @@ public function testHandleWhenControllerThrowsAThrowableAndCatchIsTrueNotHandlin
178176
->method('getArguments')
179177
->willReturn([]);
180178

181-
$kernel = new HttpKernel($dispatcher, $controllerResolver, null, $argumentResolver, false);
179+
$kernel = new HttpKernel($dispatcher, $controllerResolver, null, $argumentResolver);
182180

183181
$this->expectException(\TypeError::class);
184182
$kernel->handle(new Request(), HttpKernelInterface::MAIN_REQUEST, true);
@@ -479,7 +477,7 @@ public function testInconsistentClientIpsOnMainRequests()
479477
Request::setTrustedProxies([], -1);
480478
}
481479

482-
private function getHttpKernel(EventDispatcherInterface $eventDispatcher, $controller = null, RequestStack $requestStack = null, array $arguments = [])
480+
private function getHttpKernel(EventDispatcherInterface $eventDispatcher, $controller = null, RequestStack $requestStack = null, array $arguments = [], bool $handleAllThrowables = false)
483481
{
484482
if (null === $controller) {
485483
$controller = function () { return new Response('Hello'); };
@@ -497,7 +495,7 @@ private function getHttpKernel(EventDispatcherInterface $eventDispatcher, $contr
497495
->method('getArguments')
498496
->willReturn($arguments);
499497

500-
return new HttpKernel($eventDispatcher, $controllerResolver, $requestStack, $argumentResolver, true);
498+
return new HttpKernel($eventDispatcher, $controllerResolver, $requestStack, $argumentResolver, $handleAllThrowables);
501499
}
502500

503501
private function assertResponseEquals(Response $expected, Response $actual)

Tests/TestHttpKernel.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class TestHttpKernel extends HttpKernel implements ControllerResolverInterface,
2222
{
2323
public function __construct()
2424
{
25-
parent::__construct(new EventDispatcher(), $this, null, $this, true);
25+
parent::__construct(new EventDispatcher(), $this, null, $this);
2626
}
2727

2828
public function getController(Request $request): callable|false

0 commit comments

Comments
 (0)