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
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
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.
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
Suppression de app/Http/Kernel.php
Suppression de app/Http/Kernel.php
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.Suppression de app/Console/Kernel.php
Suppression de app/Console/Kernel.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.Suppression de app/Exceptions/Handler.php
Suppression de app/Exceptions/Handler.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.
- Détermine le répertoire racine de l’application à partir de
basePath - Crée une instance de
Application - L’enveloppe dans
ApplicationBuilderet applique les paramètres par défaut - Retourne l’instance de
ApplicationBuilder
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
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
AppRouteServiceProvider::loadRoutesUsing(), puis AppRouteServiceProvider est enregistré au moment du booting de l’application.
- Les routes
apireçoivent automatiquement le groupe de middlewaresapiet le préfixe/api - En passant une chaîne à
health, un endpoint de health check (par défaut/up) est automatiquement enregistré - Le chemin
healthest exclu même en mode maintenance (configuré viaPreventRequestsDuringMaintenance::except()) - Notez que
apiest enregistré avantweb. 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.
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 »
Rendreapi.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 :- Exécution de
register()de tous les ServiceProviders registered()de l’Applicationbooting()de l’Application- Exécution de
boot()de tous les ServiceProviders booted()de l’Application
AppServiceProvider.
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.