$e->getMessage()] : ['info' => 'Please check database logs']; error_log("PDOException: " . $e->getMessage() . " in " . $e->getFile() . ":" . $e->getLine()); } elseif (is_int($e->getCode()) && $e->getCode() >= 400 && $e->getCode() <= 599) { $status = $e->getCode(); $message = $e->getMessage(); } else { $message = $e->getMessage() ?: 'Unexpected Error Occurred'; error_log("Exception: " . $message . " in " . $e->getFile() . ":" . $e->getLine()); } if (getenv('APP_DEBUG') === 'true') { $details['file'] = $e->getFile(); $details['line'] = $e->getLine(); $details['trace'] = explode("\n", $e->getTraceAsString()); } if (self::isApiRequest()) { Response::error($message, $status, $details); } else { self::renderHtmlError($status, $message, $details, $e); } } /** * Handle PHP Warnings/Notices as Exceptions * * @param int $level * @param string $message * @param string $file * @param int $line * @return bool */ public static function handleError(int $level, string $message, string $file, int $line): bool { if (!(error_reporting() & $level)) { return false; } error_log("PHP Error [{$level}]: {$message} in {$file}:{$line}"); return true; } /** * Handle Fatal Errors on shutdown */ public static function handleShutdown(): void { $error = error_get_last(); if ($error && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) { error_log("Fatal Shutdown Error: {$error['message']} in {$error['file']}:{$error['line']}"); if (self::isApiRequest()) { Response::error("Fatal Server Error: {$error['message']}", 500); } else { self::renderHtmlError(500, "Fatal PHP Error: " . $error['message'], ['file' => $error['file'], 'line' => $error['line']]); } } } private static function isApiRequest(): bool { $uri = (string)($_SERVER['REQUEST_URI'] ?? ''); $accept = (string)($_SERVER['HTTP_ACCEPT'] ?? ''); return (strpos($uri, '/api/') !== false) || (strpos($uri, 'api=') !== false) || (strpos($uri, 'endpoint=') !== false) || (strpos($accept, 'application/json') !== false) || isset($_GET['api']) || isset($_GET['endpoint']); } /** * Render HTML Error Page * * @param int $status * @param string $message * @param array $details * @param Throwable|null $e */ private static function renderHtmlError(int $status, string $message, array $details = [], ?Throwable $e = null): void { http_response_code($status); $debugHtml = ''; if ((getenv('APP_DEBUG') === 'true' || getenv('APP_ENV') === 'local') && ($details || $e)) { $errText = $e ? htmlspecialchars($e->getMessage()) : htmlspecialchars(json_encode($details, JSON_UNESCAPED_UNICODE)); $errFile = $e ? htmlspecialchars($e->getFile() . ':' . $e->getLine()) : ''; $debugHtml = "

Debug Information (APP_DEBUG=true):

Message: {$errText}

" . ($errFile ? "

Location: {$errFile}

" : "") . "
"; } echo " Error {$status} - TTMQMS
⚠️

{$status}

{$message}

{$debugHtml}
"; exit(); } }