Skip to main content

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 unico bootstrap/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

In questo unico file configuri routing, middleware e gestione delle eccezioni. Ciò che in Laravel 10 era diviso tra app/Http/Kernel.php, app/Console/Kernel.php e app/Exceptions/Handler.php è ora concentrato qui.

bootstrap/providers.php — elenco dei service provider

Questo è il file dove si registrano i service provider. In Laravel 10 lo indicavi nell’array providers di config/app.php: ora è stato spostato in bootstrap/providers.php. Nel default di Laravel 11 c’è solo AppServiceProvider.
Installando pacchetti con composer require, il pacchetto può aggiornare automaticamente bootstrap/providers.php. config/app.php non è ignorato, ma per nuove registrazioni il posto consigliato è ora bootstrap/providers.php.

Cambiamenti nella directory routes/

api.php e channels.php non ci sono di default. Li generi al bisogno con comandi Artisan.
In routes/console.php definisci anche lo schedule.

File rimossi

Il Kernel HTTP è stato integrato in Illuminate\Foundation\Http\Kernel. La personalizzazione dei middleware si fa in bootstrap/app.php con withMiddleware().
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.
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.
Il metodo esegue questi passaggi.
  1. Determina la root dell’app da basePath
  2. Crea l’istanza Application
  3. La avvolge con ApplicationBuilder applicando le configurazioni di default
  4. Restituisce l’istanza ApplicationBuilder
Un dettaglio importante: withKernels() / withEvents() / withCommands() / withProviders() sono già stati chiamati dentro configure(). Non serve richiamarli in bootstrap/app.php.

Flusso di configurazione tramite method chain

Con la chiamata a 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

Internamente registra una callback in AppRouteServiceProvider::loadRoutesUsing() e registra AppRouteServiceProvider al booting dell’app.
Punti chiave:
  • Alle rotte api vengono applicati automaticamente il gruppo middleware api e il prefisso /api
  • Se passi una stringa a health, viene registrato automaticamente l’endpoint di health check (default /up)
  • Il path di health viene escluso anche durante la modalità di manutenzione (configurato in PreventRequestsDuringMaintenance::except())
  • Attenzione: api viene registrato prima di web. Se definisci lo stesso path in web e api, la rotta api ha priorità
  • Passando una stringa a pages abiliti 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.
Passando withBootstrapProviders: false disabiliti il caricamento di bootstrap/providers.php. Non farlo se non hai un motivo specifico.

Altri metodi principali

Intenti di design: perché è così

Configurazione “code-first”

In Laravel 10 app/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.
  1. register() di tutti i ServiceProvider
  2. registered() dell’Application
  3. booting() dell’Application
  4. boot() di tutti i ServiceProvider
  5. booted() dell’Application
Aggiungendo il codice seguente a 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.
Ultima modifica il 13 luglio 2026