Skip to main content

Comparaison avec Laravel 10 et antérieur

Laravel 11 introduit le « Slim Application Skeleton », une refonte majeure de la structure d’application. Le changement le plus important est la suppression de la dispersion de la configuration au profit d’une centralisation dans un seul endroit : bootstrap/app.php.
Ces changements concernent les nouveaux projets. Les applications Laravel 10 existantes mises à niveau continuent de fonctionner avec l’ancienne structure telle quelle.

Nouvelle structure de répertoires et de fichiers

Structure du squelette

bootstrap/app.php — le cœur de la configuration de l’application

Ce seul fichier permet de configurer le routage, les middlewares et la gestion des exceptions. La configuration qui était dispersée dans app/Http/Kernel.php, app/Console/Kernel.php et app/Exceptions/Handler.php sous Laravel 10 est ici centralisée.

bootstrap/providers.php — liste des service providers

Ce fichier est l’endroit où enregistrer les service providers. Sous Laravel 10, ils étaient déclarés dans le tableau providers de config/app.php, mais ils sont désormais séparés dans bootstrap/providers.php. Par défaut sous Laravel 11, seul AppServiceProvider est présent.
Lorsque vous installez un package avec composer require, celui-ci peut mettre à jour automatiquement bootstrap/providers.php. config/app.php n’est pas devenu obsolète, mais l’emplacement recommandé pour les nouveaux enregistrements est désormais bootstrap/providers.php.

Changements dans le répertoire routes/

api.php et channels.php ne sont plus présents par défaut. Générez-les si nécessaire avec les commandes Artisan.
routes/console.php permet également de définir les tâches planifiées.

Fichiers supprimés

Le kernel HTTP a été intégré dans Illuminate\Foundation\Http\Kernel au sein du framework. La personnalisation des middlewares se fait via withMiddleware() dans bootstrap/app.php.
Les deux responsabilités du kernel Console ont été séparées. Les commandes Artisan sont placées dans app/Console/Commands/ et détectées automatiquement, et les tâches planifiées sont écrites dans routes/console.php.
Le gestionnaire d’exceptions a été intégré dans Illuminate\Foundation\Exceptions\Handler au sein du framework. La personnalisation se fait via withExceptions() dans bootstrap/app.php.

Fonctionnement de Application::configure()

Implémentation interne dans le framework

Application::configure() est une méthode statique de Illuminate\Foundation\Application.
Cette méthode effectue les opérations suivantes :
  1. Détermine le répertoire racine de l’application à partir de basePath
  2. Crée une instance de Application
  3. L’enveloppe dans ApplicationBuilder et applique les paramètres par défaut
  4. Retourne l’instance de ApplicationBuilder
Le point important est que withKernels() / withEvents() / withCommands() / withProviders() sont déjà appelées à l’intérieur de configure(). Il n’est pas nécessaire de les appeler à nouveau dans bootstrap/app.php.

Le flux de configuration par chaînage de méthodes

L’appel de create() extrait l’instance Application depuis ApplicationBuilder, et c’est cette instance Application que bootstrap/app.php retourne (return).

Flux depuis la requête jusqu’au démarrage de l’application

public/index.php sert de point d’entrée, charge bootstrap/app.php et récupère l’Application. Le HTTP Kernel fait ensuite passer la requête par le pipeline de middlewares, puis le routeur la dispatche vers le contrôleur.

Analyse des principales méthodes de ApplicationBuilder

withRouting() — traitement interne de l’enregistrement du routage

En interne, un callback est enregistré via AppRouteServiceProvider::loadRoutesUsing(), puis AppRouteServiceProvider est enregistré au moment du booting de l’application.
Points clés :
  • Les routes api reçoivent automatiquement le groupe de middlewares api et le préfixe /api
  • En passant une chaîne à health, un endpoint de health check (par défaut /up) est automatiquement enregistré
  • Le chemin health est exclu même en mode maintenance (configuré via PreventRequestsDuringMaintenance::except())
  • Notez que api est enregistré avant web. Si vous définissez des routes web et API sur le même chemin, la route API est prioritaire
  • En passant une chaîne à pages, le routage Laravel Folio est activé

withMiddleware() — personnalisation des middlewares

withMiddleware() exécute le callback après que HttpKernel ait été résolu. C’est parce qu’il utilise le hook afterResolving(). L’objet Middleware passé au callback propose de nombreuses méthodes de personnalisation.

withExceptions() — configuration de la gestion des exceptions

withExceptions() enregistre la classe Handler du framework en tant que singleton, puis configure le callback via afterResolving(). Un objet wrapper Exceptions est passé au callback.

withProviders() — enregistrement des service providers

withProviders() est appelée par défaut à l’intérieur de Application::configure(), donc bootstrap/providers.php est chargé automatiquement. Pour passer des providers supplémentaires, il faut l’appeler explicitement dans bootstrap/app.php.
Passer withBootstrapProviders: false empêche le chargement de bootstrap/providers.php. Sauf raison particulière, omettez cet argument.

Autres méthodes importantes

Intention de conception : pourquoi il en est ainsi

Une configuration « code-first »

Sous Laravel 10 et antérieur, app/Http/Kernel.php utilisait un style de listing des middlewares dans des tableaux. C’était proche d’un fichier de configuration, avec pour inconvénient un faible support du système de types PHP et des IDE. Laravel 11 est passé à un style callback withMiddleware(function (Middleware $middleware) { ... }). Cela permet la complétion typée et une écriture naturelle de configurations dynamiques utilisant conditions, boucles et autre logique.

De la « convention plutôt que configuration » à la « configuration explicite »

Rendre api.php opt-in a permis de résoudre le fait que le groupe de middlewares api était toujours chargé même dans les applications n’utilisant pas de routes API. Le principe est : les fonctionnalités non utilisées n’existent pas par défaut.

Utilisation du hook afterResolving()

Utiliser afterResolving() dans withMiddleware() et withExceptions() permet d’éviter les problèmes d’ordre de configuration. Les méthodes de ApplicationBuilder sont appelées avant le démarrage complet de l’application, mais le traitement réel (application des paramètres au kernel) est exécuté de manière différée lors de la première résolution du kernel.

Exemples pratiques de personnalisation

Coexistence d’API et de Web

Personnalisation des middlewares

Centraliser les tâches planifiées dans bootstrap/app.php

Les tâches planifiées peuvent être écrites dans routes/console.php, mais withSchedule() permet de les regrouper dans bootstrap/app.php.

Personnalisation de la gestion des exceptions

Gérer les bindings du conteneur dans bootstrap/app.php

Pour une application de petite taille, vous pouvez écrire des bindings simples directement dans bootstrap/app.php plutôt que dans AppServiceProvider.

Ordre du processus de démarrage de Laravel

Au démarrage d’une application Laravel, les service providers et les hooks de l’Application sont exécutés dans l’ordre suivant :
  1. Exécution de register() de tous les ServiceProviders
  2. registered() de l’Application
  3. booting() de l’Application
  4. Exécution de boot() de tous les ServiceProviders
  5. booted() de l’Application
Vous pouvez vérifier cet ordre d’exécution en ajoutant le code suivant à AppServiceProvider.
Les méthodes registered(), booting() et booted() de ApplicationBuilder ne font qu’enregistrer des callbacks sur l’Application. Habituellement, il n’est pas nécessaire de les utiliser, mais elles permettent des opérations spéciales comme modifier le Kernel dont la préparation est terminée via booted().

Étapes suivantes

Conteneur de services

Comprenez le fonctionnement du conteneur de services utilisé en interne par ApplicationBuilder.

FAQ nouvelle structure

Réponses aux questions fréquentes sur la nouvelle structure d’application.
Dernière modification le 13 juillet 2026