Skip to content

Commit 90e8208

Browse files
authored
feat(core): display more data in default error handler (#1116)
1 parent 2fe1259 commit 90e8208

File tree

2 files changed

+62
-3
lines changed

2 files changed

+62
-3
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?php
2+
3+
namespace Tempest\Core\Exceptions;
4+
5+
use Tempest\Container\Container;
6+
use Tempest\Router\MatchedRoute;
7+
use Tempest\Router\Request;
8+
use Whoops\Handler\HandlerInterface;
9+
use Whoops\Handler\PrettyPageHandler;
10+
use Whoops\Run;
11+
12+
final readonly class WhoopsErrorHandler
13+
{
14+
public function __construct(
15+
private Container $container,
16+
) {}
17+
18+
public function register(): void
19+
{
20+
$whoops = new Run();
21+
$whoops->pushHandler($this->createHandler());
22+
$whoops->register();
23+
}
24+
25+
private function createHandler(): HandlerInterface
26+
{
27+
$handler = new PrettyPageHandler();
28+
29+
$handler->addDataTableCallback('Route', function () {
30+
$route = $this->container->get(MatchedRoute::class);
31+
32+
if (! $route) {
33+
return [];
34+
}
35+
36+
return [
37+
'Handler' => $route->route->handler->getDeclaringClass()->getFileName() . ':' . $route->route->handler->getName(),
38+
'URI' => $route->route->uri,
39+
'Allowed parameters' => $route->route->parameters,
40+
'Received parameters' => $route->params,
41+
];
42+
});
43+
44+
$handler->addDataTableCallback('Request', function () {
45+
$request = $this->container->get(Request::class);
46+
47+
return [
48+
'URI' => $request->uri,
49+
'Method' => $request->method->value,
50+
'Headers' => $request->headers->toArray(),
51+
'Parsed body' => array_filter(array_values($request->body)) ? $request->body : [],
52+
'Raw body' => $request->raw,
53+
];
54+
});
55+
56+
return $handler;
57+
}
58+
}

src/Tempest/Core/src/FrameworkKernel.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,15 @@
88
use Tempest\Console\Exceptions\ConsoleErrorHandler;
99
use Tempest\Container\Container;
1010
use Tempest\Container\GenericContainer;
11+
use Tempest\Core\Exceptions\WhoopsErrorHandler;
1112
use Tempest\Core\Kernel\FinishDeferredTasks;
1213
use Tempest\Core\Kernel\LoadConfig;
1314
use Tempest\Core\Kernel\LoadDiscoveryClasses;
1415
use Tempest\Core\Kernel\LoadDiscoveryLocations;
1516
use Tempest\Core\ShellExecutors\GenericShellExecutor;
1617
use Tempest\EventBus\EventBus;
18+
use Tempest\Router\MatchedRoute;
19+
use Tempest\Router\Request;
1720
use Whoops\Handler\PrettyPageHandler;
1821
use Whoops\Run;
1922

@@ -204,9 +207,7 @@ public function registerEmergencyErrorHandler(): self
204207
// In development, we want to register a developer-friendly error
205208
// handler as soon as possible to catch any kind of exception.
206209
if (PHP_SAPI !== 'cli' && ! $environment->isProduction()) {
207-
$whoops = new Run();
208-
$whoops->pushHandler(new PrettyPageHandler());
209-
$whoops->register();
210+
new WhoopsErrorHandler($this->container)->register();
210211
}
211212

212213
return $this;

0 commit comments

Comments
 (0)