> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Upgrade von Laravel 10 auf 11

> Erläuterung der Upgrade-Schritte und wichtigsten Änderungen beim Wechsel von Laravel 10 auf 11

## Einleitung

Laravel 11 wurde im März 2024 veröffentlicht. Dieser Leitfaden beschreibt die Upgrade-Schritte von Laravel 10.x auf 11.x.

<Info>
  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.
</Info>

### Automatisches Upgrade mit Laravel Shift

Sie können das Upgrade auch mit [Laravel Shift](https://laravelshift.com/) 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.

```json theme={null}
{
  "require": {
    "laravel/framework": "^11.0",
    "nunomaduro/collision": "^8.1"
  }
}
```

Wenn Sie weitere Pakete nutzen, aktualisieren Sie diese ebenfalls.

```json theme={null}
{
  "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:

```shell theme={null}
composer update
```

Wenn Sie Cashier Stripe, Passport, Sanctum, Spark Stripe oder Telescope verwenden, veröffentlichen Sie deren Migrationen in Ihrer Anwendung.

```shell theme={null}
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.

```shell theme={null}
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.

```php theme={null}
class User extends Authenticatable
{
    protected $authPasswordName = 'custom_password_field';
}
```

Zum Deaktivieren dieses Verhaltens ergänzen Sie in `config/hashing.php`:

```php theme={null}
'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.

```php theme={null}
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.

```php theme={null}
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.

```php theme={null}
// 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.

```shell theme={null}
php artisan schema:dump
```

#### Änderung der Fließkomma-Typen

**Auswirkung: Hoch**

Die Migrationstypen `double` und `float` wurden über alle Datenbanken hinweg vereinheitlicht.

```php theme={null}
// 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.

```php theme={null}
$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.

```php theme={null}
'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`.

```php theme={null}
$table->geometry('shapes');
$table->geography('coordinates');
```

Für explizite Angabe von Subtyp und Raumbezugssystem verwenden Sie `subtype` und `srid`.

```php theme={null}
$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.

```php theme={null}
// 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.

```php theme={null}
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`.

```php theme={null}
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:

```shell theme={null}
php artisan vendor:publish --tag=sanctum-migrations
```

Aktualisieren Sie außerdem die Middleware-Konfiguration in `config/sanctum.php`:

```php theme={null}
'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](https://laravel.com/docs/11.x/helpers#method-once) 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.

| Änderung                                        | Auswirkung | Maßnahme                                     |
| ----------------------------------------------- | ---------- | -------------------------------------------- |
| Abhängigkeiten in `composer.json` aktualisieren | Hoch       | Auf `laravel/framework ^11.0` heben          |
| PHP 8.2 erforderlich                            | Hoch       | PHP-Version prüfen                           |
| Attributerhalt beim Ändern von Spalten          | Hoch       | Nutzungsstellen von `change()` prüfen        |
| Änderung der Fließkomma-Typen                   | Hoch       | Definitionen von `double`/`float` prüfen     |
| SQLite 3.26.0+ erforderlich                     | Hoch       | SQLite-Version prüfen                        |
| Sanctum `^4.0`                                  | Hoch       | Migrationen veröffentlichen                  |
| Carbon 3                                        | Mittel     | Rückgabewerte von `diffIn*` prüfen           |
| Rate Limits pro Sekunde                         | Mittel     | `decayMinutes` durch `decaySeconds` ersetzen |
| Entfernung von Doctrine DBAL                    | Niedrig    | Auf native Schema-Methoden umsteigen         |

***

## Referenzen

* [Offizieller Upgrade-Guide (Englisch)](https://laravel.com/docs/11.x/upgrade)
* [Diff im Repository laravel/laravel (10.x → 11.x)](https://github.com/laravel/laravel/compare/10.x...11.x)
* [Laravel Shift](https://laravelshift.com) – Community-Dienst zur Upgrade-Automatisierung
* [Carbon-3-Changelog](https://github.com/briannesbitt/Carbon/releases/tag/3.0.0)


## Related topics

- [Upgrade von Laravel 9 auf 10](/de/blog/upgrade-9-to-10.md)
- [Upgrade-Anleitung von Laravel 11 auf 12](/de/blog/upgrade-11-to-12.md)
- [Upgrade-Anleitung von Laravel 12 auf 13](/de/blog/upgrade-12-to-13.md)
- [Upgrade von Laravel 8 auf 9](/de/blog/upgrade-8-to-9.md)
- [Migrationsleitfaden von der alten zur neuen Struktur](/de/advanced/app-structure-migration.md)
