withRouting( web: __DIR__.'/../routes/web.php', api: __DIR__.'/../routes/api.php', commands: __DIR__.'/../routes/console.php', health: '/up', ) ->withMiddleware(function (Middleware $middleware): void { $middleware->alias([ 'session.unique' => VerifieSessionUnique::class, 'maj.activite' => MetAJourActivite::class, 'abilities' => CheckAbilities::class, 'ability' => CheckForAnyAbility::class, ]); $middleware->web(append: [PolitiqueSecuriteContenu::class]); // Postées directement par un navigateur ou par Moodle, jamais avec // notre jeton CSRF : "->withoutMiddleware(ValidateCsrfToken::class)" // sur la route elle-même ne suffit pas (constaté le 2026-10-14 en // vérifiant /lti/lancement en réel : 419 malgré cet appel sur la // route — /csp-rapport avait exactement le même défaut, jamais vu // faute de surveillance de ses échecs). C'est cette exception // globale, pas celle sur la route, qui fonctionne réellement. $middleware->validateCsrfTokens(except: ['csp-rapport', 'lti/connexion', 'lti/lancement/*']); }) ->withExceptions(function (Exceptions $exceptions): void { $exceptions->shouldRenderJsonWhen( fn (Request $request) => $request->is('api/*') || $request->expectsJson(), ); })->create();