'). Il n'y a pas de routeur — une URL correspond * toujours à un fichier réel. * * Tout Throwable est rattrapé ici et rendu sous forme de page d'erreur HTML * autonome : sans ce filet, une base non migrée renverrait une page blanche ou, * pire, une trace d'exception exposant l'arborescence du serveur. Le détail * technique reste journalisé côté serveur par Security::reportThrowable(). * * @param string $method Nom de la méthode de PageController à appeler, qui sert * aussi de clé de page pour acces_role_page. */ function runPage(string $method): void { try { $pdo = require __DIR__ . '/app/bootstrap.php'; $controller = new PageController($pdo); if (!method_exists($controller, $method)) { throw new RuntimeException('Page inconnue.'); } $controller->{$method}(); } catch (Throwable $e) { http_response_code(500); Security::sendHtmlHeaders(); $message = htmlspecialchars( Security::reportThrowable($e, 'Une erreur technique empêche l’affichage de cette page.'), ENT_QUOTES, 'UTF-8' ); echo '
' . $message . '
'; echo 'Contactez l’administrateur de l’application : le détail de l’erreur a été journalisé.
'; } }