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

# Upgraden van Laravel 10 naar 11

> Het stappenplan voor de upgrade van Laravel 10 naar 11 en uitleg van de belangrijkste wijzigingen

## Inleiding

Laravel 11 is uitgebracht in maart 2024. Deze gids beschrijft de stappen om te upgraden van Laravel 10.x naar 11.x.

<Info>
  De geschatte tijd voor de upgrade is **ongeveer 15 minuten**. De impact van breaking changes op je applicatie hangt echter af van de omvang en de functies die je gebruikt.
</Info>

### Automatisch upgraden met Laravel Shift

Je kunt de upgrade ook automatiseren met [Laravel Shift](https://laravelshift.com/). Shift werkt de dependencies en configuratiebestanden van je applicatie automatisch bij.

***

## Wijzigingen per impactniveau

### Impact: hoog

* Dependencies bijwerken
* Wijziging van de applicatiestructuur
* Wijziging van floating-point-types
* Behoud van attributen bij kolomwijzigingen
* Minimale SQLite-versie
* Sanctum-update

### Impact: middel

* Carbon 3
* Wachtwoorden opnieuw hashen
* Rate limiting per seconde
* Spatie Once-package

### Impact: laag

* Verwijdering van Doctrine DBAL
* De `casts`-methode van Eloquent-modellen
* Wijziging van spatial types
* Het `Enumerable`-contract
* Het `UserProvider`-contract
* Het `Authenticatable`-contract

***

## Upgradestappen

### Dependencies bijwerken

**Impact: hoog**

Werk de volgende dependencies in `composer.json` bij.

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

Gebruik je packages, werk die dan ook bij.

```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"
  }
}
```

Installeer daarna de dependencies met het volgende commando.

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

Gebruik je Cashier Stripe, Passport, Sanctum, Spark Stripe of Telescope, dan moet je de migraties naar je applicatie publiceren.

```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
```

Gebruik je de Laravel installer, werk die dan ook bij.

```shell theme={null}
composer global require laravel/installer:^5.6
```

Had je eerder handmatig `doctrine/dbal` toegevoegd, dan kun je die verwijderen. Laravel 11 heeft geen afhankelijkheid meer van deze package.

***

## PHP-versievereiste

**Impact: hoog**

Laravel 11 vereist **PHP 8.2.0 of hoger**. Bovendien vereist de HTTP-client van Laravel **curl 7.34.0 of hoger**.

***

## Wijziging van de applicatiestructuur

**Impact: hoog**

In Laravel 11 is de standaard applicatiestructuur vereenvoudigd. Het aantal serviceproviders, middleware en configuratiebestanden is flink verminderd.

Het wordt echter **niet aanbevolen** om bij het upgraden van een Laravel 10-applicatie naar Laravel 11 ook de applicatiestructuur te migreren. Laravel 11 is zo ontworpen dat het ook de applicatiestructuur van Laravel 10 ondersteunt.

De belangrijkste structurele wijzigingen:

* Middleware, exception handlers en routing worden nu direct geconfigureerd in `bootstrap/app.php`
* `app/Http/Kernel.php` is vervallen en samengevoegd in `bootstrap/app.php`
* Het aantal standaard serviceproviders is verminderd; beheer gebeurt in `bootstrap/providers.php`
* Het aantal bestanden in de directory `config/` is verminderd (indien nodig te publiceren met `php artisan config:publish`)

***

## Breaking changes

### Authenticatie

#### Wachtwoorden opnieuw hashen

**Impact: middel**

Laravel 11 hasht wachtwoorden automatisch opnieuw bij het inloggen wanneer de "work factor" van het hash-algoritme is gewijzigd.

Heet het wachtwoordveld van je `User`-model anders dan `password`, geef dat dan op via de property `authPasswordName` van het model.

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

Om deze functie uit te schakelen, voeg je het volgende toe aan `config/hashing.php`.

```php theme={null}
'rehash_on_login' => false,
```

#### Het `UserProvider`-contract

**Impact: laag**

Aan het contract `Illuminate\Contracts\Auth\UserProvider` is de methode `rehashPasswordIfRequired` toegevoegd. Heb je klassen die deze interface implementeren, voeg de methode dan toe.

```php theme={null}
public function rehashPasswordIfRequired(Authenticatable $user, array $credentials, bool $force = false);
```

#### Het `Authenticatable`-contract

**Impact: laag**

Aan het contract `Illuminate\Contracts\Auth\Authenticatable` is de methode `getAuthPasswordName` toegevoegd. Heb je klassen die deze interface implementeren, voeg de methode dan toe.

```php theme={null}
public function getAuthPasswordName()
{
    return 'password';
}
```

***

### Database

#### Minimale SQLite-versie

**Impact: hoog**

Gebruik je SQLite, dan is **SQLite 3.26.0 of hoger** vereist.

Merk op dat in nieuwe Laravel 11-projecten de standaard databasedriver is gewijzigd naar SQLite.

#### Behoud van attributen bij kolomwijzigingen

**Impact: hoog**

Bij het wijzigen van een kolom moet je expliciet alle modifiers opgeven die je na de wijziging wilt behouden. Niet-opgegeven attributen worden verwijderd.

```php theme={null}
// In Laravel 10 bleven unsigned, default en comment behouden
Schema::table('users', function (Blueprint $table) {
    $table->integer('votes')->nullable()->change();
});

// In Laravel 11 moet je expliciet alle attributen opgeven
Schema::table('users', function (Blueprint $table) {
    $table->integer('votes')
        ->unsigned()
        ->default(1)
        ->comment('The vote count')
        ->nullable()
        ->change();
});
```

Wil je niet al je bestaande migraties bijwerken, squash je migraties dan.

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

#### Wijziging van floating-point-types

**Impact: hoog**

De migratiekolomtypes `double` en `float` zijn nu uniform over alle databases.

```php theme={null}
// double: argumenten voor totaal aantal cijfers en decimalen zijn niet meer nodig
$table->double('amount');

// float: alleen een optioneel argument voor de precisie
$table->float('amount', precision: 53);
```

De methodes `unsignedDecimal`, `unsignedDouble` en `unsignedFloat` zijn verwijderd. Wil je nog steeds het attribuut `unsigned` gebruiken, geef dat dan op via method chaining.

```php theme={null}
$table->decimal('amount', total: 8, places: 2)->unsigned();
$table->double('amount')->unsigned();
$table->float('amount', precision: 53)->unsigned();
```

#### De `casts`-methode van Eloquent-modellen

**Impact: laag**

Op de basisklasse van Eloquent-modellen is nu een methode `casts` gedefinieerd. Heb je in een model van je applicatie een relatie met de naam `casts` gedefinieerd, dan botst die naam en moet je die wijzigen.

#### Dedicated MariaDB-driver

**Impact: zeer laag**

Laravel 11 heeft een dedicated databasedriver voor MariaDB toegevoegd. Verbind je met MariaDB, dan kun je in de configuratie de driver `mariadb` gebruiken.

```php theme={null}
'driver' => 'mariadb',
```

#### Wijziging van spatial types

**Impact: laag**

De spatial kolomtypes zijn nu uniform over alle databases. Gebruik `geometry` of `geography` in plaats van methodes zoals `point`, `lineString` en `polygon`.

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

Wil je het type of het spatial reference system expliciet opgeven, geef dan `subtype` en `srid` mee.

```php theme={null}
$table->geometry('dimension', subtype: 'polygon', srid: 0);
$table->geography('latitude', subtype: 'point', srid: 4326);
```

#### Verwijdering van Doctrine DBAL

**Impact: laag**

Laravel heeft de afhankelijkheid van Doctrine DBAL laten vallen. De volgende klassen en methodes zijn verwijderd.

* `Schema\Builder::useNativeSchemaOperationsIfPossible()`
* `Connection::getDoctrineConnection()`
* `Connection::getDoctrineSchemaManager()`
* `Connection::registerDoctrineType()`
* `DatabaseManager::registerDoctrineType()`
* De klasse `Schema\Grammars\ChangeColumn`
* De klasse `Schema\Grammars\RenameColumn`

Gebruik voor database-inspectie de nieuwe native methodes zoals `Schema::getTables()`, `Schema::getColumns()`, `Schema::getIndexes()` en `Schema::getForeignKeys()`.

***

### Datums

#### Carbon 3

**Impact: middel**

Laravel 11 ondersteunt zowel Carbon 2 als Carbon 3. Let er bij een upgrade naar Carbon 3 op dat de `diffIn*`-methodes nu floating-point-getallen teruggeven en dat negatieve waarden de tijdsrichting aangeven.

***

### Rate limiting

#### Rate limiting per seconde

**Impact: middel**

Laravel 11 ondersteunt rate limiting per seconde in plaats van per minuut. De constructors van de klassen `GlobalLimit` en `Limit` nemen nu seconden aan.

```php theme={null}
// Voorheen (minuten)
new GlobalLimit($attempts, 2); // 2 minuten

// Nu (seconden)
new GlobalLimit($attempts, 2 * 60); // 120 seconden
```

De property `decayMinutes` van de klasse `Limit` is hernoemd naar `decaySeconds` en werkt nu in seconden.

Ook de constructors van `ThrottlesExceptions` en `ThrottlesExceptionsWithRedis` nemen nu seconden aan.

```php theme={null}
new ThrottlesExceptions($attempts, 2 * 60);
new ThrottlesExceptionsWithRedis($attempts, 2 * 60);
```

***

### Packages

#### Serviceproviders publiceren

**Impact: zeer laag**

Nieuwe Laravel 11-applicaties hebben geen `providers`-array in `config/app.php`. Publiceert je package serviceproviders, gebruik dan de methode `ServiceProvider::addProviderToBootstrapFile`.

```php theme={null}
use Illuminate\Support\ServiceProvider;

ServiceProvider::addProviderToBootstrapFile(Provider::class);
```

***

### Sanctum

#### Sanctum-update

**Impact: hoog**

Laravel 11 ondersteunt Sanctum 3.x niet. Werk de Sanctum-dependency in `composer.json` bij naar `^4.0`.

Sanctum 4.0 laadt migraties niet meer automatisch. Publiceer ze met het volgende commando.

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

Werk ook de middleware-configuratie in `config/sanctum.php` bij.

```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,
],
```

***

### Spatie Once-package

**Impact: middel**

Laravel 11 biedt nu een eigen [`once`-functie](https://laravel.com/docs/11.x/helpers#method-once). Gebruik je de package `spatie/once`, verwijder die dan uit `composer.json` om conflicten te voorkomen.

***

## Samenvatting

Laravel 11 is een versie met grote structurele wijzigingen, maar omdat de applicatiestructuur van Laravel 10 gewoon blijft werken, kun je stapsgewijs migreren.

| Wijziging                                  | Impact | Actie                                                  |
| ------------------------------------------ | ------ | ------------------------------------------------------ |
| Dependencies in `composer.json` bijwerken  | Hoog   | Wijzig naar `laravel/framework ^11.0`                  |
| PHP 8.2 vereist                            | Hoog   | Controleer je PHP-versie                               |
| Behoud van attributen bij kolomwijzigingen | Hoog   | Controleer waar `change()` wordt gebruikt              |
| Wijziging van floating-point-types         | Hoog   | Controleer de definities van `double`/`float`-kolommen |
| SQLite 3.26.0+ vereist                     | Hoog   | Controleer je SQLite-versie                            |
| Sanctum `^4.0`                             | Hoog   | Publiceer de migraties                                 |
| Carbon 3                                   | Middel | Controleer de returnwaarden van de `diffIn*`-methodes  |
| Rate limiting per seconde                  | Middel | Wijzig `decayMinutes` naar `decaySeconds`              |
| Verwijdering van Doctrine DBAL             | Laag   | Migreer naar de native schemamethodes                  |

***

## Referenties

* [Officiële upgradegids (Engels)](https://laravel.com/docs/11.x/upgrade)
* [Diff van de laravel/laravel-repository (10.x → 11.x)](https://github.com/laravel/laravel/compare/10.x...11.x)
* [Laravel Shift](https://laravelshift.com) — communitydienst die upgrades automatiseert
* [Carbon 3-changelog](https://github.com/briannesbitt/Carbon/releases/tag/3.0.0)


## Related topics

- [Upgraden van Laravel 9 naar 10](/nl/blog/upgrade-9-to-10.md)
- [Upgraden van Laravel 8 naar 9](/nl/blog/upgrade-8-to-9.md)
- [Upgradegids van Laravel 11 naar 12](/nl/blog/upgrade-11-to-12.md)
- [Upgradegids van Laravel 12 naar 13](/nl/blog/upgrade-12-to-13.md)
- [Migratiegids van oude naar nieuwe structuur](/nl/advanced/app-structure-migration.md)
