Introduzione
Questa guida illustra come migrare dalla vecchia struttura applicativa di Laravel 10 e precedenti (con classiKernel e più service provider) allo Slim Application Skeleton di Laravel 11 e successivi.
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.0o 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.Sostituire bootstrap/app.php
Il vecchio Nuovo (Laravel 11+):
bootstrap/app.php creava l’istanza $app e registrava i kernel. Sostituiscilo con la chain Application::configure().Vecchio (Laravel 10):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.Eliminare il kernel HTTP (app/Http/Kernel.php)
In In Laravel 11 i middleware qui sopra sono incorporati nel framework come default. Se non hai personalizzazioni, puoi eliminare direttamente Completato il trasferimento, elimina
app/Http/Kernel.php erano definiti middleware globali, gruppi di middleware e alias.Vecchio (app/Http/Kernel.php):app/Http/Kernel.php.In caso di personalizzazioni (middleware aggiunti o rimossi), trasferisci il tutto in withMiddleware() di bootstrap/app.php prima di eliminare.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.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):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.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.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):withExceptions() di bootstrap/app.php prima di eliminare.$dontFlash, puoi trasferirle in modo analogo.app/Exceptions/Handler.php.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):withRouting() di bootstrap/app.php.AppServiceProvider::boot().HOME, sostituiscila con la stringa URL diretta o spostala in AppServiceProvider.Dopo la migrazione elimina app/Providers/RouteServiceProvider.php.Riordinare i service provider
In Laravel 10 c’erano 5 service provider di default. Uniscili in
Esempio di migrazione del contenuto di Dopo aver eliminato i file dei provider non più necessari, rimuovi anche l’array Inoltre crea
AppServiceProvider.php.Provider da eliminare (dopo aver trasferito i contenuti in AppServiceProvider):| File | Destinazione |
|---|---|
app/Providers/AuthServiceProvider.php | Gate::policy() ecc. in AppServiceProvider::boot() |
app/Providers/BroadcastServiceProvider.php | Se usi il broadcasting: withBroadcasting() in bootstrap/app.php |
app/Providers/EventServiceProvider.php | Event::listen() ecc. in AppServiceProvider::boot() |
app/Providers/RouteServiceProvider.php | Già gestito nello step precedente |
app/Providers/AuthServiceProvider.php:providers da config/app.php.bootstrap/providers.php per la nuova struttura.Se
bootstrap/providers.php è presente, Laravel privilegia questo file come elenco dei provider.Aggiornare la classe base Controller
In Laravel 10 la classe base 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 usava i trait AuthorizesRequests e ValidatesRequests. La nuova classe base di Laravel 11 è una classe astratta semplice senza questi trait.Vecchio (Laravel 10):| Vecchio metodo (tramite trait) | Nuovo metodo |
|---|---|
$this->validate($request, $rules) | $request->validate($rules) |
$this->authorize('update', $post) | Gate::authorize('update', $post) |
$this->authorizeResource(Post::class) | In Laravel 11 non c’è un’alternativa immediata: lascia App\Http\Controllers\Controller come in Laravel 10 |
Controller. Non è obbligatorio cambiare tutto insieme.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.Aggiornare tests/TestCase.php
Il trait
CreatesApplication non serve più, quindi modifica il file.
Puoi eliminare tests/CreatesApplication.php.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.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).Riepilogo
| Elemento migrato | Vecchia posizione | Nuova posizione |
|---|---|---|
| Middleware HTTP | app/Http/Kernel.php | withMiddleware() in bootstrap/app.php |
| Gestione eccezioni | app/Exceptions/Handler.php | withExceptions() in bootstrap/app.php |
| Definizione schedule | app/Console/Kernel.php | routes/console.php |
| Registrazione rotte | app/Providers/RouteServiceProvider.php | withRouting() in bootstrap/app.php |
| Elenco service provider | Array providers in config/app.php | bootstrap/providers.php |
| Registrazione policy | app/Providers/AuthServiceProvider.php | Auto-registrazione. Manuale in AppServiceProvider::boot() |
| Listener di eventi | app/Providers/EventServiceProvider.php | Auto-registrazione. Manuale in AppServiceProvider::boot() |