Files
michaelschiemer/src/Framework/ErrorHandling/ErrorHandler.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);
}
}