' . $title . '
' . $message . '
get('LOGS'), '/\\') . DIRECTORY_SEPARATOR; app_ensure_dir($dir); ini_set('log_errors', '1'); ini_set('error_log', $dir . 'php-error.log'); ini_set('display_errors', app_is_prod() ? '0' : '1'); error_reporting(E_ALL); } function app_error_meta(int $code): array { return match ($code) { 400 => ['title' => 'Requête invalide', 'message' => 'La requête envoyée est invalide.'], 403 => ['title' => 'Accès refusé', 'message' => 'Tu n\u2019as pas accès à cette ressource.'], 404 => ['title' => 'Page introuvable', 'message' => 'La page demandée est introuvable.'], default => ['title' => 'Erreur serveur', 'message' => 'Une erreur est survenue.'], }; } function app_render_error_fallback(int $code): void { $meta = app_error_meta($code); $base = rtrim((string) Base::instance()->get('BASE'), '/'); while (ob_get_level() > 0) { ob_end_clean(); } if (!headers_sent()) { http_response_code($code); header('Content-Type: text/html; charset=UTF-8'); header('Cache-Control: no-cache, no-store, must-revalidate'); } $title = htmlspecialchars((string) $meta['title'], ENT_QUOTES, 'UTF-8'); $message = htmlspecialchars((string) $meta['message'], ENT_QUOTES, 'UTF-8'); $href = htmlspecialchars($base . '/', ENT_QUOTES, 'UTF-8'); echo '
' . $message . '