Einleitung
Laravel 9 wurde am 8. Februar 2022 veröffentlicht. Dieser Leitfaden fasst die Upgrade-Schritte von Laravel 8.x auf 9.x sowie die einflussreichsten Änderungen zusammen.Der geschätzte Zeitaufwand für das Upgrade beträgt etwa 30 Minuten. Je nach Nutzung von Mailversand, Dateispeicher, benutzerdefinierten Casts und Overrides von Core-Klassen kann der Aufwand jedoch steigen.
Automatisches Upgrade mit Laravel Shift
Sie können das Upgrade auch mit Laravel Shift automatisieren. Shift unterstützt Sie beim Aktualisieren voncomposer.json und Konfigurationsdateien und ist ein guter Ausgangspunkt für den Diff-Vergleich.
Änderungen nach Auswirkung
Auswirkung: Hoch
- Aktualisierung der Abhängigkeiten
- Umstieg auf Flysystem 3.x
- Umstieg auf Symfony Mailer
Auswirkung: Mittel
- Methoden
firstOrNew/firstOrCreate/updateOrCreatebeiBelongsToMany - Verhalten von Custom Casts bei
null - Standard-Timeout des HTTP-Clients
- Ergänzung von PHP-Rückgabetypen
- Umbenennung des Postgres-
schema-Settings - Entfall der
assertDeleted-Methode - Verlagerung des
lang-Verzeichnisses - Änderung der Password-Rule
- Änderung der Methoden
when/unless - Umgang mit nicht validierten Array-Keys in der Validierung
Upgrade-Schritte
Abhängigkeiten aktualisieren
Auswirkung: Hoch Laravel 9 erfordert PHP 8.0.2 oder höher. Prüfen Sie zuerst die Abhängigkeiten incomposer.json.
facade/ignitionentfernen und durchspatie/laravel-ignition:^1.0ersetzen- Bei Nutzung von
pusher/pusher-php-serverauf^5.0aktualisieren - Prüfen, ob die verwendeten Dritt-Pakete eine Laravel-9-kompatible Version haben
- Bei Nutzung des Vonage-Notification-Channels dessen separaten Upgrade-Guide beachten
PHP-Version
Auswirkung: Hoch Laravel 9 benötigt PHP 8.0.2 oder höher. Vereinheitlichen Sie die PHP-Version in CI, lokaler und produktiver Umgebung, bevor Sie das Upgrade fortsetzen.Umstieg auf Symfony Mailer
Auswirkung: Hoch Eine der zentralen Änderungen in Laravel 9 ist der Wechsel von SwiftMailer (Maintenance-Ende Dezember 2021) zu Symfony Mailer. Für Anwendungen, die nurMail::to()->send() verwenden, sind die Auswirkungen gering. Wer die Low-Level-API von SwiftMailer direkt nutzt, muss prüfen.
Treiber-Abhängigkeiten
Von withSwiftMessage zu withSymfonyMessage
send, html, raw und plain von Illuminate\Mail\Mailer liefern nun Illuminate\Mail\SentMessage statt void. Auch die Eigenschaft message im Event MessageSent enthält jetzt Symfony\Component\Mime\Email statt Swift_Message.
SMTP-Konfiguration überarbeiten
Bei Symfony Mailer entfällt diestream-Option in der SMTP-Konfiguration; die unterstützten Einstellungen wandern auf die oberste Ebene.
auth_mode-Konfiguration ist ebenfalls nicht mehr nötig. Statt ungültige Mails im Nachhinein zurückzuholen, ist es sicherer, sie bereits vor dem Versand zu validieren.
Umstieg auf Flysystem 3.x
Auswirkung: Hoch Laravel 9 hat die interne Implementierung derStorage-Facade von Flysystem 1.x auf 3.x aktualisiert. Die Dateimethoden bleiben so kompatibel wie möglich; es gibt jedoch Unterschiede bei Exceptions, Rückgabewerten und Adapter-Registrierung.
Zusätzliche Treiber installieren
Wichtige Verhaltensänderungen von Storage
put/write/writeStreamüberschreiben bestehende Dateien standardmäßig- Bei Schreibfehlern wird
falsestatt einer Exception zurückgegeben - Beim Lesen nicht vorhandener Dateien wird
nullstatt einer Exception zurückgegeben deleteauf einer nicht existierenden Datei gibttruezurück- Der Cached Adapter wurde entfernt; der Key
cacheindisk-Konfigurationen kann gelöscht werden
throw.
Storage::extend() so an, dass er direkt einen Illuminate\Filesystem\FilesystemAdapter zurückgibt.
firstOrNew / firstOrCreate / updateOrCreate bei BelongsToMany
Auswirkung: Mittel
In Laravel 8 wurden die im ersten Argument übergebenen Attribute mit der Pivot-Tabelle verglichen. In Laravel 9 werden sie mit der Tabelle des verwandten Modells verglichen.
firstOrCreate nun als zweites Argument $values und richtet sich damit nach dem Verhalten der anderen Relationen.
Custom Casts und null
Auswirkung: Mittel
In Laravel 9 wird die set-Methode eines Custom-Casts auch dann aufgerufen, wenn null zugewiesen wird. Casts, die null nicht vorsehen, können nach dem Upgrade Exceptions werfen.
Standard-Timeout des HTTP-Clients
Auswirkung: Mittel Der Default-Timeout des HTTP-Clients liegt nun bei 30 Sekunden. Zuvor wartete er im Zweifel unbegrenzt.Ergänzung von PHP-Rückgabetypen
Auswirkung: Mittel In Laravel 9 wurden entsprechend den PHP- und Symfony-Anforderungen Rückgabetypen in zahlreichen Core-Klassen ergänzt. Wenn Sie Core-Klassen erweitern und dabeioffsetGet, offsetSet, jsonSerialize, open, read u. Ä. überschreiben, ergänzen Sie in Ihrer Implementierung dieselben Rückgabetypen.
Umbenennung des Postgres-schema-Settings
Auswirkung: Mittel
Wenn Sie den Search-Path in Postgres-Verbindungen konfigurieren, benennen Sie in config/database.php den Key von schema in search_path um.
assertDeleted → assertModelMissing
Auswirkung: Mittel
Ersetzen Sie assertDeleted zur Prüfung eines gelöschten Modells durch assertModelMissing.
Verlagerung des lang-Verzeichnisses
Auswirkung: Mittel
In neuen Laravel-9-Anwendungen liegen die Sprachdateien nun im Projekt-Root unter lang und nicht mehr unter resources/lang. Bestehende Anwendungen laufen weiterhin ohne größere Auswirkungen, doch bei Angleichung an das neue Skelett oder wenn ein Paket Übersetzungen veröffentlicht, sollten Sie das prüfen.
Änderung der Password-Rule
Auswirkung: Mittel Die Rulepassword, die den Abgleich mit dem Passwort des angemeldeten Nutzers durchführt, wurde in current_password umbenannt.
Änderung der Methoden when / unless
Auswirkung: Mittel
In Laravel 8 galten Closures, die an when oder unless übergeben wurden, als truthy – der Zweig wurde unbeabsichtigt ausgeführt. In Laravel 9 wird die Closure ausgeführt und ihr Rückgabewert als Bedingung verwendet.
Umgang mit nicht validierten Array-Keys
Auswirkung: Mittel In Laravel 9 werden nicht validierte Array-Keys in der Rückgabe vonvalidated() stets ausgeschlossen. Wenn Sie das alte Verhalten aus Laravel 8 wünschen, rufen Sie explizit includeUnvalidatedArrayKeys() auf.
Fazit
Beim Upgrade von Laravel 8 auf 9 stehen die Aktualisierung auf PHP 8.0.2, der Wechsel zu Symfony Mailer und die Umstellung auf Flysystem 3.x im Zentrum. Wenn Sie zuerst Mailversand, Storage, eigene Casts und Test-Helper prüfen, verringern sich die Nachwirkungen nach dem Upgrade.| Änderung | Auswirkung | Maßnahme |
|---|---|---|
PHP 8.0.2 / laravel/framework:^9.0 | Hoch | composer.json und Laufzeitumgebung aktualisieren |
| Umstieg auf Symfony Mailer | Hoch | SwiftMailer-APIs und Mail-Konfiguration prüfen |
| Flysystem 3.x | Hoch | Rückgabewerte, Exceptions und Treiber-Abhängigkeiten von Storage prüfen |
Upsert-Methoden bei BelongsToMany | Mittel | Vergleichsziel liegt nun bei der Tabelle des verwandten Modells |
Custom Casts und null | Mittel | set() gegen null-Werte robust machen |
| 30-s-Timeout beim HTTP-Client | Mittel | Nur bei Bedarf timeout() explizit setzen |
Entfall von assertDeleted | Mittel | Durch assertModelMissing() ersetzen |
Verlagerung des lang-Verzeichnisses | Mittel | Feste Pfade durch app()->langPath() ersetzen |
Änderung der password-Rule | Mittel | Zu current_password migrieren |
| Ausschluss nicht validierter Array-Keys | Mittel | Bei Bedarf includeUnvalidatedArrayKeys() nutzen |
Referenzen
- Offizieller Upgrade-Guide (Englisch)
- laravel/docs 9.x
upgrade.md - Diff im Repository laravel/laravel (8.x → 9.x)
- Laravel Shift – Community-Dienst zur Upgrade-Automatisierung
- Symfony-Mailer-Dokumentation
- Flysystem-3-Dokumentation