Skip to main content

Introduzione

Questa guida illustra come migrare dalla vecchia struttura applicativa di Laravel 10 e precedenti (con classi Kernel e più service provider) allo Slim Application Skeleton di Laravel 11 e successivi.
La documentazione ufficiale non raccomanda questa migrazione.
  • La vecchia struttura di Laravel 10 continua a funzionare anche su Laravel 11 e versioni successive. Fino alle versioni attuali (Laravel 13 compreso) non c’è alcun piano di dismissione.
  • La migrazione è del tutto opzionale. Non è obbligatoria né raccomandata.
  • Se non conosci a fondo le differenze tra vecchia e nuova struttura, ti sconsigliamo caldamente di migrare. È un’operazione per sviluppatori che conoscono bene il framework internamente.
  • Prima di migrare, fai sempre un backup e verifica che tutti i test siano verdi.

Quando serve migrare

Puoi valutare la migrazione nei casi seguenti.
  • Vuoi allineare il progetto alla struttura standard più recente per facilitare l’onboarding di nuovi membri con la documentazione ufficiale
  • Vuoi mantenere coerenza con pacchetti o starter kit creati in Laravel 11+
  • Vuoi ridurre file e classi ereditati dalla vecchia struttura e semplificare la codebase

Prerequisiti

La guida presuppone questa situazione.
  • L’upgrade di Laravel è già stato completato (laravel/framework ^11.0 o successivi)
  • Tutti i test esistenti passano
  • Hai compreso la struttura applicativa di Laravel 11+ (vedi Struttura dell’applicazione da Laravel 11)

Esempio di migrazione

Ecco la procedura per un progetto creato con Laravel 10 + Breeze (stack Blade) in cui vuoi mantenere Breeze ma migrare solo la struttura applicativa.
1

Sostituire bootstrap/app.php

Il vecchio bootstrap/app.php creava l’istanza $app e registrava i kernel. Sostituiscilo con la chain Application::configure().Vecchio (Laravel 10):
Nuovo (Laravel 11+):
Le callback di withMiddleware() e withExceptions() sono i posti in cui trasferirai le impostazioni dei file kernel che eliminerai nei prossimi step. Lasciale vuote per ora e le compileremo dopo.
2

Eliminare il kernel HTTP (app/Http/Kernel.php)

In app/Http/Kernel.php erano definiti middleware globali, gruppi di middleware e alias.Vecchio (app/Http/Kernel.php):
In Laravel 11 i middleware qui sopra sono incorporati nel framework come default. Se non hai personalizzazioni, puoi eliminare direttamente app/Http/Kernel.php.In caso di personalizzazioni (middleware aggiunti o rimossi), trasferisci il tutto in withMiddleware() di bootstrap/app.php prima di eliminare.
Completato il trasferimento, elimina app/Http/Kernel.php.
In Laravel 11 puoi rimuovere anche le classi middleware di default (TrustProxies, EncryptCookies, VerifyCsrfToken, ecc.) da app/Http/Middleware/. Sono integrate nel framework: se non le personalizzi, il file non serve.
3

Eliminare il kernel della console (app/Console/Kernel.php)

app/Console/Kernel.php gestiva schedule e auto-load dei comandi.Vecchio (app/Console/Kernel.php):
Auto-load dei comandi: da Laravel 11 la directory app/Console/Commands/ viene scansionata automaticamente, quindi $this->load() non serve.Definizione dello schedule: spostala in routes/console.php o in withSchedule() di bootstrap/app.php.
Dopo la migrazione elimina app/Console/Kernel.php.
Non eliminare i file dei comandi Artisan custom nella directory app/Console/. Lascia i comandi al loro posto ed elimina solo il file della classe Kernel.
4

Eliminare l'exception handler (app/Exceptions/Handler.php)

app/Exceptions/Handler.php gestiva le impostazioni di report e rendering delle eccezioni.Vecchio (app/Exceptions/Handler.php):
Se hai personalizzazioni, trasferiscile in withExceptions() di bootstrap/app.php prima di eliminare.
Se avevi aggiunto voci proprie in $dontFlash, puoi trasferirle in modo analogo.
Completato il trasferimento, elimina app/Exceptions/Handler.php.
5

Eliminare RouteServiceProvider e migrare la registrazione delle rotte

app/Providers/RouteServiceProvider.php caricava i file delle rotte e configurava il rate limit.Vecchio (app/Providers/RouteServiceProvider.php):
Registrazione delle rotte: sposta in withRouting() di bootstrap/app.php.
Rate limit: sposta in AppServiceProvider::boot().
Se utilizzi la costante HOME, sostituiscila con la stringa URL diretta o spostala in AppServiceProvider.Dopo la migrazione elimina app/Providers/RouteServiceProvider.php.
6

Riordinare i service provider

In Laravel 10 c’erano 5 service provider di default. Uniscili in AppServiceProvider.php.Provider da eliminare (dopo aver trasferito i contenuti in AppServiceProvider):Esempio di migrazione del contenuto di app/Providers/AuthServiceProvider.php:
Dopo aver eliminato i file dei provider non più necessari, rimuovi anche l’array providers da config/app.php.
Inoltre crea bootstrap/providers.php per la nuova struttura.
Se bootstrap/providers.php è presente, Laravel privilegia questo file come elenco dei provider.
7

Aggiornare la classe base Controller

In Laravel 10 la classe base Controller usava i trait AuthorizesRequests e ValidatesRequests. La nuova classe base di Laravel 11 è una classe astratta semplice senza questi trait.Vecchio (Laravel 10):
Nuovo (Laravel 11+):
Sostituzioni per le funzionalità dei trait:Se i controller esistenti usano i metodi dei trait, puoi correggerli uno a uno oppure mantenere i trait sulla classe base Controller. Non è obbligatorio cambiare tutto insieme.
Se i controller di autenticazione generati da Breeze o Jetstream chiamano $this->validate() o $this->authorize(), verifica il funzionamento prima di modificare la classe base.
8

Eliminare i file di config non necessari

File come config/cors.php, config/hashing.php, config/view.php che non hai modificato rispetto al default si possono eliminare. Mantieni quelli che hai personalizzato.
9

Aggiornare public/index.php

Cambia in modo profondo per adeguarsi alla nuova struttura.
10

Aggiornare artisan

Riscrivi anche il file artisan.
11

Aggiornare tests/TestCase.php

Il trait CreatesApplication non serve più, quindi modifica il file. Puoi eliminare tests/CreatesApplication.php.
12

Aggiornare .env, .env.example, phpunit.xml

CACHE_DRIVER è diventato CACHE_STORE e sono state aggiunte voci: modificale se necessario. Queste modifiche toccano file di config e ambienti di produzione, quindi procedi con cautela. Non è obbligatorio adeguarsi a tutti i costi.
13

Verifica del funzionamento

Terminata la migrazione, verifica nell’ordine seguente.
In caso di problemi, ripristina i file eliminati dal backup e leggi i messaggi di errore.

Struttura dei file dopo la migrazione

Dopo la migrazione la struttura del progetto risulta come segue (i punti di cambiamento rispetto alla vecchia struttura sono indicati).
Ultima modifica il 13 luglio 2026