Zum Hauptinhalt springen

Einleitung

Laravel 11 wurde im März 2024 veröffentlicht. Dieser Leitfaden beschreibt die Upgrade-Schritte von Laravel 10.x auf 11.x.
Der geschätzte Zeitaufwand liegt bei etwa 15 Minuten. Die tatsächliche Auswirkung der Breaking Changes hängt jedoch vom Umfang und den genutzten Funktionen ab.

Automatisches Upgrade mit Laravel Shift

Sie können das Upgrade auch mit Laravel Shift automatisieren. Shift aktualisiert Abhängigkeiten und Konfigurationsdateien der Anwendung automatisch.

Änderungen nach Auswirkung

Auswirkung: Hoch

  • Aktualisierung der Abhängigkeiten
  • Änderungen der Anwendungsstruktur
  • Änderung der Fließkomma-Typen
  • Attributerhalt beim Ändern von Spalten
  • SQLite-Mindestversion
  • Aktualisierung von Sanctum

Auswirkung: Mittel

  • Carbon 3
  • Rehash von Passwörtern
  • Rate Limits pro Sekunde
  • Paket Spatie Once

Auswirkung: Niedrig

  • Entfernung von Doctrine DBAL
  • Methode casts an Eloquent-Modellen
  • Änderungen bei räumlichen Typen
  • Contract Enumerable
  • Contract UserProvider
  • Contract Authenticatable

Upgrade-Schritte

Abhängigkeiten aktualisieren

Auswirkung: Hoch Aktualisieren Sie in composer.json folgende Abhängigkeiten.
{
  "require": {
    "laravel/framework": "^11.0",
    "nunomaduro/collision": "^8.1"
  }
}
Wenn Sie weitere Pakete nutzen, aktualisieren Sie diese ebenfalls.
{
  "require": {
    "laravel/breeze": "^2.0",
    "laravel/cashier": "^15.0",
    "laravel/dusk": "^8.0",
    "laravel/jetstream": "^5.0",
    "laravel/octane": "^2.3",
    "laravel/passport": "^12.0",
    "laravel/sanctum": "^4.0",
    "laravel/scout": "^10.0",
    "laravel/spark-stripe": "^5.0",
    "laravel/telescope": "^5.0",
    "livewire/livewire": "^3.4",
    "inertiajs/inertia-laravel": "^1.0"
  }
}
Installieren Sie anschließend die Abhängigkeiten:
composer update
Wenn Sie Cashier Stripe, Passport, Sanctum, Spark Stripe oder Telescope verwenden, veröffentlichen Sie deren Migrationen in Ihrer Anwendung.
php artisan vendor:publish --tag=cashier-migrations
php artisan vendor:publish --tag=passport-migrations
php artisan vendor:publish --tag=sanctum-migrations
php artisan vendor:publish --tag=spark-migrations
php artisan vendor:publish --tag=telescope-migrations
Wenn Sie den Laravel-Installer verwenden, aktualisieren Sie ihn ebenfalls.
composer global require laravel/installer:^5.6
Falls Sie zuvor doctrine/dbal manuell hinzugefügt hatten, können Sie es entfernen. In Laravel 11 gibt es keine Abhängigkeit mehr zu diesem Paket.

PHP-Version

Auswirkung: Hoch Laravel 11 benötigt PHP 8.2.0 oder höher. Der HTTP-Client von Laravel benötigt zudem curl 7.34.0 oder höher.

Änderungen der Anwendungsstruktur

Auswirkung: Hoch In Laravel 11 wurde die Default-Struktur der Anwendung vereinfacht. Die Zahl der Service Provider, Middlewares und Konfigurationsdateien wurde deutlich reduziert. Beim Upgrade einer Laravel-10-Anwendung auf 11 wird nicht empfohlen, die Struktur mitzumigrieren. Laravel 11 ist so gestaltet, dass die Struktur einer Laravel-10-Anwendung weiter funktioniert. Wichtige Strukturänderungen:
  • Middleware, Exception-Handling und Routing werden nun direkt in bootstrap/app.php konfiguriert
  • app/Http/Kernel.php entfällt und wurde in bootstrap/app.php integriert
  • Die Anzahl der Default-Service-Provider ist reduziert; sie werden in bootstrap/providers.php verwaltet
  • Die Zahl der Dateien in config/ ist reduziert (bei Bedarf per php artisan config:publish veröffentlichen)

Breaking Changes

Authentifizierung

Rehash von Passwörtern

Auswirkung: Mittel In Laravel 11 wird das Passwort beim Anmelden automatisch neu gehasht, wenn sich der „Work Factor” des Hash-Algorithmus geändert hat. Wenn das Passwortfeld Ihres User-Modells nicht password heißt, geben Sie den Namen über die Model-Property authPasswordName an.
class User extends Authenticatable
{
    protected $authPasswordName = 'custom_password_field';
}
Zum Deaktivieren dieses Verhaltens ergänzen Sie in config/hashing.php:
'rehash_on_login' => false,

Contract UserProvider

Auswirkung: Niedrig Der Contract Illuminate\Contracts\Auth\UserProvider erhielt die Methode rehashPasswordIfRequired. Wenn Sie diesen Contract selbst implementieren, ergänzen Sie die Methode.
public function rehashPasswordIfRequired(Authenticatable $user, array $credentials, bool $force = false);

Contract Authenticatable

Auswirkung: Niedrig Der Contract Illuminate\Contracts\Auth\Authenticatable erhielt die Methode getAuthPasswordName. Wenn Sie diesen Contract selbst implementieren, ergänzen Sie die Methode.
public function getAuthPasswordName()
{
    return 'password';
}

Datenbank

SQLite-Mindestversion

Auswirkung: Hoch Wenn Sie SQLite nutzen, ist SQLite 3.26.0 oder höher erforderlich. In neuen Laravel-11-Projekten ist SQLite außerdem der Default-Datenbanktreiber.

Attributerhalt beim Ändern von Spalten

Auswirkung: Hoch Beim Ändern einer Spalte müssen Sie alle nach der Änderung beizubehaltenden Modifier explizit angeben. Nicht angegebene Attribute werden verworfen.
// In Laravel 10 blieben unsigned, default und comment erhalten
Schema::table('users', function (Blueprint $table) {
    $table->integer('votes')->nullable()->change();
});

// In Laravel 11 müssen alle Attribute explizit angegeben werden
Schema::table('users', function (Blueprint $table) {
    $table->integer('votes')
        ->unsigned()
        ->default(1)
        ->comment('The vote count')
        ->nullable()
        ->change();
});
Wenn Sie nicht alle bestehenden Migrationen anpassen möchten, squashen Sie sie.
php artisan schema:dump

Änderung der Fließkomma-Typen

Auswirkung: Hoch Die Migrationstypen double und float wurden über alle Datenbanken hinweg vereinheitlicht.
// double: Argumente für Gesamt- und Nachkommastellen entfallen
$table->double('amount');

// float: nur ein optionales Argument für die Präzision
$table->float('amount', precision: 53);
Die Methoden unsignedDecimal, unsignedDouble und unsignedFloat wurden entfernt. Für das Attribut unsigned verwenden Sie das Method-Chaining.
$table->decimal('amount', total: 8, places: 2)->unsigned();
$table->double('amount')->unsigned();
$table->float('amount', precision: 53)->unsigned();

Methode casts an Eloquent-Modellen

Auswirkung: Niedrig In der Eloquent-Basisklasse ist nun eine Methode casts definiert. Wenn Ihr Modell eine Relation namens casts besitzt, kommt es zum Namenskonflikt und Sie müssen umbenennen.

Dedizierter Treiber für MariaDB

Auswirkung: Sehr niedrig Laravel 11 bringt einen dedizierten Datenbanktreiber für MariaDB mit. Für MariaDB-Verbindungen können Sie den Treiber mariadb verwenden.
'driver' => 'mariadb',

Änderungen bei räumlichen Typen

Auswirkung: Niedrig Räumliche Spaltentypen wurden datenbankübergreifend vereinheitlicht. Nutzen Sie statt Methoden wie point, lineString, polygon die Methoden geometry oder geography.
$table->geometry('shapes');
$table->geography('coordinates');
Für explizite Angabe von Subtyp und Raumbezugssystem verwenden Sie subtype und srid.
$table->geometry('dimension', subtype: 'polygon', srid: 0);
$table->geography('latitude', subtype: 'point', srid: 4326);

Entfernung von Doctrine DBAL

Auswirkung: Niedrig Die Abhängigkeit zu Doctrine DBAL wurde aus Laravel entfernt. Folgende Klassen/Methoden fielen weg:
  • Schema\Builder::useNativeSchemaOperationsIfPossible()
  • Connection::getDoctrineConnection()
  • Connection::getDoctrineSchemaManager()
  • Connection::registerDoctrineType()
  • DatabaseManager::registerDoctrineType()
  • Klasse Schema\Grammars\ChangeColumn
  • Klasse Schema\Grammars\RenameColumn
Zur Datenbankinspektion verwenden Sie die neuen nativen Methoden Schema::getTables(), Schema::getColumns(), Schema::getIndexes() und Schema::getForeignKeys().

Datum

Carbon 3

Auswirkung: Mittel Laravel 11 unterstützt sowohl Carbon 2 als auch Carbon 3. Beim Upgrade auf Carbon 3 beachten Sie, dass diffIn*-Methoden nun Fließkommazahlen zurückgeben und die Richtung mit negativen Werten ausdrücken.

Rate Limiting

Rate Limits pro Sekunde

Auswirkung: Mittel Laravel 11 unterstützt Rate Limits nicht mehr nur pro Minute, sondern auch pro Sekunde. Die Konstruktoren der Klassen GlobalLimit und Limit erwarten nun Sekunden.
// Vorher (Minuten)
new GlobalLimit($attempts, 2); // 2 Minuten

// Nachher (Sekunden)
new GlobalLimit($attempts, 2 * 60); // 120 Sekunden
Die Property decayMinutes der Klasse Limit wurde in decaySeconds umbenannt und arbeitet in Sekunden. Auch die Konstruktoren von ThrottlesExceptions und ThrottlesExceptionsWithRedis erwarten Sekunden.
new ThrottlesExceptions($attempts, 2 * 60);
new ThrottlesExceptionsWithRedis($attempts, 2 * 60);

Pakete

Service Provider veröffentlichen

Auswirkung: Sehr niedrig In neuen Laravel-11-Anwendungen existiert kein providers-Array mehr in config/app.php. Wenn Ihr Paket einen Service Provider veröffentlicht, verwenden Sie die Methode ServiceProvider::addProviderToBootstrapFile.
use Illuminate\Support\ServiceProvider;

ServiceProvider::addProviderToBootstrapFile(Provider::class);

Sanctum

Sanctum-Update

Auswirkung: Hoch Laravel 11 unterstützt Sanctum 3.x nicht mehr. Setzen Sie die Sanctum-Abhängigkeit in composer.json auf ^4.0. Sanctum 4.0 lädt Migrationen nicht mehr automatisch. Veröffentlichen Sie sie:
php artisan vendor:publish --tag=sanctum-migrations
Aktualisieren Sie außerdem die Middleware-Konfiguration in config/sanctum.php:
'middleware' => [
    'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class,
    'encrypt_cookies' => Illuminate\Cookie\Middleware\EncryptCookies::class,
    'validate_csrf_token' => Illuminate\Foundation\Http\Middleware\ValidateCsrfToken::class,
],

Paket Spatie Once

Auswirkung: Mittel Laravel 11 bringt eine eigene once-Funktion mit. Wenn Sie das Paket spatie/once verwenden, entfernen Sie es aus composer.json, um Konflikte zu vermeiden.

Fazit

Laravel 11 enthält große strukturelle Änderungen, aber die Struktur einer Laravel-10-Anwendung funktioniert weiterhin, sodass Sie schrittweise migrieren können.
ÄnderungAuswirkungMaßnahme
Abhängigkeiten in composer.json aktualisierenHochAuf laravel/framework ^11.0 heben
PHP 8.2 erforderlichHochPHP-Version prüfen
Attributerhalt beim Ändern von SpaltenHochNutzungsstellen von change() prüfen
Änderung der Fließkomma-TypenHochDefinitionen von double/float prüfen
SQLite 3.26.0+ erforderlichHochSQLite-Version prüfen
Sanctum ^4.0HochMigrationen veröffentlichen
Carbon 3MittelRückgabewerte von diffIn* prüfen
Rate Limits pro SekundeMitteldecayMinutes durch decaySeconds ersetzen
Entfernung von Doctrine DBALNiedrigAuf native Schema-Methoden umsteigen

Referenzen

Zuletzt geändert am 13. Juli 2026