Confronto con Laravel 10 e precedenti
Con Laravel 11 la struttura dell’applicazione è stata rinnovata in modo profondo, sotto il nome di “Slim Application Skeleton”. Il cambiamento più grande è la fine della dispersione della configurazione: tutto confluisce in un unicobootstrap/app.php.
Il cambiamento riguarda i nuovi progetti. L’aggiornamento di app Laravel 10 esistenti mantiene funzionante la vecchia struttura.
Nuova struttura di directory e file
Struttura dello skeleton
bootstrap/app.php — il centro della configurazione
app/Http/Kernel.php, app/Console/Kernel.php e app/Exceptions/Handler.php è ora concentrato qui.
bootstrap/providers.php — elenco dei service provider
providers di config/app.php: ora è stato spostato in bootstrap/providers.php. Nel default di Laravel 11 c’è solo AppServiceProvider.
Cambiamenti nella directory routes/
api.php e channels.php non ci sono di default. Li generi al bisogno con comandi Artisan.
routes/console.php definisci anche lo schedule.
File rimossi
Rimozione di app/Http/Kernel.php
Rimozione di app/Http/Kernel.php
Il Kernel HTTP è stato integrato in
Illuminate\Foundation\Http\Kernel. La personalizzazione dei middleware si fa in bootstrap/app.php con withMiddleware().Rimozione di app/Console/Kernel.php
Rimozione di app/Console/Kernel.php
I due ruoli del Kernel della console sono stati separati. I comandi Artisan vanno in
app/Console/Commands/ (auto-scoperti), lo schedule si scrive in routes/console.php.Rimozione di app/Exceptions/Handler.php
Rimozione di app/Exceptions/Handler.php
L’exception handler è stato integrato in
Illuminate\Foundation\Exceptions\Handler. La personalizzazione si fa in bootstrap/app.php con withExceptions().Come funziona Application::configure()
Implementazione interna nel framework
Application::configure() è un metodo statico di Illuminate\Foundation\Application.
- Determina la root dell’app da
basePath - Crea l’istanza
Application - La avvolge con
ApplicationBuilderapplicando le configurazioni di default - Restituisce l’istanza
ApplicationBuilder
withKernels() / withEvents() / withCommands() / withProviders() sono già stati chiamati dentro configure(). Non serve richiamarli in bootstrap/app.php.
Flusso di configurazione tramite method chain
create() viene estratta l’istanza Application dal ApplicationBuilder: è questa istanza che bootstrap/app.php restituisce.
Dal ricevimento della richiesta all’avvio dell’app
public/index.php è l’entry point: legge bootstrap/app.php e ottiene l’Application. Poi il Kernel HTTP fa passare la richiesta nella pipeline dei middleware e il router la dispatcha al controller.
Approfondimento sui metodi principali di ApplicationBuilder
withRouting() — processo interno di registrazione delle rotte
AppRouteServiceProvider::loadRoutesUsing() e registra AppRouteServiceProvider al booting dell’app.
- Alle rotte
apivengono applicati automaticamente il gruppo middlewareapie il prefisso/api - Se passi una stringa a
health, viene registrato automaticamente l’endpoint di health check (default/up) - Il path di
healthviene escluso anche durante la modalità di manutenzione (configurato inPreventRequestsDuringMaintenance::except()) - Attenzione:
apiviene registrato prima diweb. Se definisci lo stesso path in web e api, la rotta api ha priorità - Passando una stringa a
pagesabiliti il routing di Laravel Folio
withMiddleware() — personalizzazione dei middleware
withMiddleware() esegue la callback dopo che HttpKernel è stato risolto: usa infatti l’hook afterResolving(). L’oggetto Middleware passato alla callback ha molti metodi di personalizzazione.
withExceptions() — configurazione della gestione eccezioni
withExceptions() registra la classe Handler del framework come singleton e imposta la callback tramite afterResolving(). Alla callback viene passato un wrapper Exceptions.
withProviders() — registrazione dei service provider
withProviders() viene chiamato di default dentro Application::configure(), quindi bootstrap/providers.php viene caricato automaticamente. Se vuoi passare provider aggiuntivi devi chiamarlo esplicitamente in bootstrap/app.php.
Altri metodi principali
Intenti di design: perché è così
Configurazione “code-first”
In Laravel 10app/Http/Kernel.php elencava i middleware in array. È una scrittura vicina a un file di configurazione, poco supportata dal type system PHP e dagli IDE.
Con Laravel 11 si è passati a uno stile a callback come withMiddleware(function (Middleware $middleware) { ... }). In questo modo ottieni autocompletamento dei tipi e puoi scrivere in modo naturale logica dinamica con condizioni e cicli.
Da “convention over configuration” a “configurazione esplicita”
api.php è diventato opt-in: nelle app che non usano API non ha più senso caricare sempre il gruppo api. Filosofia: ciò che non usi non è presente di default.
Uso dell’hook afterResolving()
withMiddleware() e withExceptions() usano afterResolving() per evitare problemi d’ordine nella configurazione. I metodi di ApplicationBuilder vengono chiamati prima che l’app sia completamente avviata, ma le azioni concrete (applicare le impostazioni al Kernel) vengono differite fino alla prima risoluzione del Kernel.
Esempi di personalizzazione pratica
Convivenza di API e Web
Personalizzazione dei middleware
Concentrare lo schedule in bootstrap/app.php
Lo schedule si può scrivere anche in routes/console.php, ma con withSchedule() puoi raggrupparlo in bootstrap/app.php.
Personalizzare la gestione delle eccezioni
Gestire i binding del container in bootstrap/app.php
In app piccole puoi scrivere binding semplici direttamente in bootstrap/app.php invece che in AppServiceProvider.
Ordine di avvio di Laravel
All’avvio dell’app, service provider e hook dell’Application vengono eseguiti in questo ordine.register()di tutti i ServiceProviderregistered()dell’Applicationbooting()dell’Applicationboot()di tutti i ServiceProviderbooted()dell’Application
AppServiceProvider puoi verificarne l’ordine.
registered(), booting() e booted() di ApplicationBuilder si limitano a registrare callback nell’Application. Di solito non ti servono, ma consentono operazioni particolari, come modificare il Kernel a booted() quando i preparativi di avvio sono completi.
Prossimi passi
Service container
Comprendi il meccanismo del service container usato internamente da
ApplicationBuilder.FAQ nuova struttura
Raccolta di dubbi frequenti e risposte sulla nuova struttura dell’applicazione.