Skip to main content

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 von composer.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 / updateOrCreate bei BelongsToMany
  • 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 in composer.json.
Für einige Anwendungen sind zusätzlich diese Updates nötig:
  • facade/ignition entfernen und durch spatie/laravel-ignition:^1.0 ersetzen
  • Bei Nutzung von pusher/pusher-php-server auf ^5.0 aktualisieren
  • Prüfen, ob die verwendeten Dritt-Pakete eine Laravel-9-kompatible Version haben
  • Bei Nutzung des Vonage-Notification-Channels dessen separaten Upgrade-Guide beachten
Installieren Sie anschließend die Abhängigkeiten:

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 nur Mail::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 die stream-Option in der SMTP-Konfiguration; die unterstützten Einstellungen wandern auf die oberste Ebene.
Die explizite 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 der Storage-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 false statt einer Exception zurückgegeben
  • Beim Lesen nicht vorhandener Dateien wird null statt einer Exception zurückgegeben
  • delete auf einer nicht existierenden Datei gibt true zurück
  • Der Cached Adapter wurde entfernt; der Key cache in disk-Konfigurationen kann gelöscht werden
Wenn Sie wie bisher bei Schreibfehlern Exceptions möchten, setzen Sie die Option throw.
Wenn Sie eigene Filesystem-Treiber registrieren, passen Sie den Callback von 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.
Außerdem akzeptiert 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 dabei offsetGet, 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.

assertDeletedassertModelMissing

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 Rule password, 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 von validated() 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.

Referenzen

Zuletzt geändert am 13. Juli 2026