64 lines
1.9 KiB
PHP
64 lines
1.9 KiB
PHP
<?php
|
|
|
|
namespace App\Framework\ErrorHandling;
|
|
|
|
use App\Framework\Http\Headers;
|
|
use App\Framework\Http\HttpResponse;
|
|
use App\Framework\Http\ResponseEmitter;
|
|
use App\Framework\Http\Status;
|
|
use JetBrains\PhpStorm\NoReturn;
|
|
use Throwable;
|
|
|
|
final class ErrorHandler
|
|
{
|
|
public static function register(ResponseEmitter $emitter): void
|
|
{
|
|
set_exception_handler(function (Throwable $exception) use ($emitter) {
|
|
self::handleException($exception, $emitter);
|
|
});
|
|
|
|
set_error_handler(function (int $errno, string $errstr, string $errfile, int $errline) use ($emitter) {
|
|
$exception = new \ErrorException($errstr, 0, $errno, $errfile, $errline);
|
|
self::handleException($exception, $emitter);
|
|
});
|
|
|
|
register_shutdown_function(function () use ($emitter) {
|
|
$error = error_get_last();
|
|
if ($error) {
|
|
$exception = new \ErrorException(
|
|
$error['message'],
|
|
0,
|
|
$error['type'],
|
|
$error['file'],
|
|
$error['line']
|
|
);
|
|
self::handleException($exception, $emitter);
|
|
}
|
|
});
|
|
}
|
|
|
|
#[NoReturn]
|
|
private static function handleException(Throwable $e, ResponseEmitter $emitter): void
|
|
{
|
|
$isDebug = $_ENV['APP_DEBUG'] ?? false;
|
|
|
|
$status = Status::INTERNAL_SERVER_ERROR ?? 500;
|
|
$message = $isDebug
|
|
? sprintf("Fehler: %s in %s:%d\n\n%s", $e->getMessage(), $e->getFile(), $e->getLine(), $e->getTraceAsString())
|
|
: "Es ist ein interner Fehler aufgetreten.";
|
|
|
|
$headers = new Headers()->with('Content-Type', 'text/plain; charset=utf-8');
|
|
|
|
$response = new HttpResponse(
|
|
status: $status,
|
|
headers: $headers,
|
|
body: $message
|
|
);
|
|
|
|
// Sende die Fehlermeldung (so früh wie möglich!)
|
|
$emitter->emit($response);
|
|
|
|
exit(1);
|
|
}
|
|
}
|