Introduzione
Laravel 9 è stato rilasciato l’8 febbraio 2022. Questa guida riassume la procedura di aggiornamento da Laravel 8.x a 9.x e le modifiche di maggiore impatto.Il tempo stimato per l’aggiornamento è di circa 30 minuti. Il carico di lavoro può aumentare in base a invio email, storage dei file, cast personalizzati e override di classi core del framework.
Aggiornamento automatico con Laravel Shift
Puoi automatizzare l’aggiornamento con Laravel Shift. Shift aiuta ad aggiornarecomposer.json e i file di configurazione ed è un buon punto di partenza per il confronto delle differenze.
Cambiamenti per livello di impatto
Impatto: Alto
- Aggiornamento delle dipendenze
- Migrazione a Flysystem 3.x
- Migrazione a Symfony Mailer
Impatto: Medio
- Metodi
firstOrNew/firstOrCreate/updateOrCreatediBelongsToMany - Cast personalizzati e comportamento su
null - Timeout predefinito del client HTTP
- Aggiunta di return type PHP
- Rinomina della configurazione
schemadi Postgres - Rimozione del metodo
assertDeleted - Spostamento della directory
lang - Modifiche alle regole della password
- Modifiche ai metodi
when/unless - Trattamento delle chiavi di array non validate
Procedura di aggiornamento
Aggiornamento delle dipendenze
Impatto: Alto Laravel 9 richiede PHP 8.0.2 o superiore. Rivedi prima di tutto le dipendenze incomposer.json.
- Rimuovi
facade/ignitione sostituiscilo conspatie/laravel-ignition:^1.0 - Se usi
pusher/pusher-php-server, aggiornalo a^5.0 - Verifica che i pacchetti di terze parti in uso siano compatibili con Laravel 9
- Se usi il canale di notifica Vonage, consulta anche la guida di aggiornamento dedicata
Requisiti versione PHP
Impatto: Alto Laravel 9 richiede PHP 8.0.2 o superiore. Allinea la versione di PHP in CI, ambiente di sviluppo locale e produzione prima di procedere all’aggiornamento.Migrazione a Symfony Mailer
Impatto: Alto Una delle grandi modifiche di Laravel 9 è la migrazione da SwiftMailer (fine manutenzione dicembre 2021) a Symfony Mailer. Le app che usano soloMail::to()->send() ne risentono poco; se invece tocchi direttamente le API a basso livello di SwiftMailer devi verificare.
Dipendenze dei driver
Da withSwiftMessage a withSymfonyMessage
send, html, raw e plain di Illuminate\Mail\Mailer restituiscono ora Illuminate\Mail\SentMessage invece di void. Inoltre, la proprietà message dell’evento MessageSent contiene Symfony\Component\Mime\Email invece di Swift_Message.
Revisione della configurazione SMTP
In Symfony Mailer l’opzionestream di SMTP è stata rimossa e le impostazioni supportate si spostano al livello superiore.
auth_mode. È più sicuro spostare l’operatività verso la validazione degli indirizzi email prima dell’invio, invece che recuperarli dopo.
Migrazione a Flysystem 3.x
Impatto: Alto Laravel 9 aggiorna l’implementazione interna della facadeStorage da Flysystem 1.x a 3.x. I metodi di manipolazione dei file mantengono la massima compatibilità possibile, ma ci sono differenze in eccezioni, valori di ritorno e registrazione degli adapter.
Installazione aggiuntiva dei driver
Principali modifiche di comportamento di Storage
put/write/writeStreamsovrascrivono di default i file esistenti- In caso di fallimento della scrittura viene restituito
false, non un’eccezione - Leggendo un file inesistente si ottiene
null, non un’eccezione deletesu un file inesistente restituiscetrue- L’adapter cached è stato rimosso: la chiave
cachenella configurazione deidiskpuò essere eliminata
throw.
Storage::extend() in modo che restituisca direttamente un Illuminate\Filesystem\FilesystemAdapter.
firstOrNew / firstOrCreate / updateOrCreate di BelongsToMany
Impatto: Medio
In Laravel 8 l’array di attributi passato come primo argomento a questi metodi era confrontato con la tabella pivot. In Laravel 9 il confronto avviene con la tabella del modello correlato.
firstOrCreate può ora ricevere $values come secondo argomento, allineandosi al comportamento delle altre relazioni.
Cast personalizzati e null
Impatto: Medio
In Laravel 9 il metodo set dei custom cast viene chiamato anche assegnando null. I cast che non prevedono null potrebbero generare eccezioni dopo l’aggiornamento.
Timeout predefinito del client HTTP
Impatto: Medio Il timeout predefinito del client HTTP è ora di 30 secondi. Prima era possibile attendere all’infinito.Aggiunta di return type PHP
Impatto: Medio In Laravel 9 sono stati aggiunti i tipi di ritorno a varie classi core in linea con i requisiti di PHP e Symfony. Se estendi classi core di Laravel e sovrascrivi metodi comeoffsetGet, offsetSet, jsonSerialize, open o read, aggiungi gli stessi tipi di ritorno anche nella tua implementazione.
Rinomina della configurazione schema di Postgres
Impatto: Medio
Se imposti il search path per la connessione Postgres, in config/database.php cambia la chiave da schema a search_path.
Da assertDeleted a assertModelMissing
Impatto: Medio
Il metodo assertDeleted usato per verificare l’eliminazione di un modello va sostituito con assertModelMissing.
Spostamento della directory lang
Impatto: Medio
Nelle nuove app Laravel 9 i file di lingua non stanno più in resources/lang ma nella directory lang nella root del progetto. Per le app esistenti l’impatto è ridotto se non intendi allinearti al nuovo scheletro, ma se vuoi allinearti o se pubblichi traduzioni nei tuoi pacchetti, rivedi il codice.
Modifiche alle regole della password
Impatto: Medio La regolapassword che verifica che la password corrisponda a quella dell’utente attualmente loggato è stata rinominata in current_password.
Modifiche ai metodi when / unless
Impatto: Medio
In Laravel 8, passando una closure a when o unless, la closure stessa veniva valutata come truthy e il branch veniva eseguito involontariamente. In Laravel 9 la closure viene eseguita e il suo valore di ritorno è usato come condizione.
Trattamento delle chiavi di array non validate
Impatto: Medio In Laravel 9 le chiavi di array non validate vengono sempre escluse dall’array restituito davalidated(). Se vuoi mantenere il comportamento di Laravel 8, chiama esplicitamente includeUnvalidatedArrayKeys().
Conclusioni
L’aggiornamento da Laravel 8 a 9 verte su PHP 8.0.2, migrazione a Symfony Mailer e adattamento a Flysystem 3.x. Ispezionando prima invio email, storage, cast personalizzati e helper di test riduci gli imprevisti post-aggiornamento.| Modifica | Impatto | Azione |
|---|---|---|
PHP 8.0.2 / laravel/framework:^9.0 | Alto | Aggiorna composer.json e l’ambiente di esecuzione |
| Migrazione a Symfony Mailer | Alto | Verifica le API SwiftMailer e la configurazione mail |
| Flysystem 3.x | Alto | Verifica valori di ritorno, eccezioni e driver di Storage |
Metodi upsert di BelongsToMany | Medio | Nota che il target di ricerca è ora la tabella del modello correlato |
Cast personalizzati e null | Medio | Correggi set() perché regga null |
| Timeout HTTP di 30 secondi | Medio | Specifica timeout() solo dove serve |
Rimozione di assertDeleted | Medio | Sostituisci con assertModelMissing() |
Spostamento di lang | Medio | Cambia i riferimenti fissi in app()->langPath() |
Modifica regola password | Medio | Aggiorna a current_password |
| Esclusione chiavi non validate | Medio | Usa includeUnvalidatedArrayKeys() solo se necessario |
Riferimenti
- Guida ufficiale all’aggiornamento (in inglese)
- laravel/docs 9.x
upgrade.md - Diff del repository laravel/laravel (8.x → 9.x)
- Laravel Shift — servizio della community che automatizza l’aggiornamento
- Documentazione Symfony Mailer
- Documentazione Flysystem 3