chore: lots of changes
This commit is contained in:
63
src/Framework/ErrorHandling/ErrorHandler.php
Normal file
63
src/Framework/ErrorHandling/ErrorHandler.php
Normal file
@@ -0,0 +1,63 @@
|
||||
<?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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user