'Une erreur serveur est survenue.']; if (Security::debugEnabled()) { $payload['details'] = $exception->getMessage(); } Security::reportThrowable($exception, 'Erreur API.'); self::send(500, $payload); }); } /** * Émet la réponse JSON et TERMINE le script. * * Ce exit final est ce qui permet aux gardes (Access, Csrf, Request) de * s'écrire en une ligne sans que l'appelant ait à tester leur retour. * * @param int $status Code HTTP (200, 403, 409, 422, 500…). * @param array $payload Corps sérialisé en JSON. */ public static function send(int $status, array $payload): void { if (!headers_sent()) { header('Content-Type: application/json; charset=utf-8'); header('X-Content-Type-Options: nosniff'); // Les réponses dépendent du rôle en session : jamais de cache partagé. header('Cache-Control: no-store'); } http_response_code($status); // UNESCAPED_UNICODE garde les accents lisibles ; INVALID_UTF8_SUBSTITUTE // évite qu'une donnée mal encodée en base fasse échouer tout l'encodage. echo json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE); exit; } }