> ## 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 9 naar 10

> Het stappenplan voor de upgrade van Laravel 9.x naar 10.x en uitleg van de belangrijkste wijzigingen

## Inleiding

Laravel 10 is uitgebracht op 14 februari 2023. Deze gids beschrijft de stappen om te upgraden van Laravel 9.x naar 10.x.

<Info>
  De geschatte tijd voor de upgrade is **ongeveer 10 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
* `minimum-stability` bijwerken

### Impact: middel

* Wijziging van database-expressies
* Verwijdering van de `$dates`-property van modellen
* Monolog 3
* Redis-cachetags
* Wijziging van servicemocking
* De taaldirectory

### Impact: laag

* Berichten van closure-validatieregels
* De `after`-methode van form requests
* De public-path-binding
* De `QueryException`-constructor
* De returnwaarde van de rate limiter
* Verwijdering van de methode `Redirect::home`
* Verwijdering van de methode `Bus::dispatchNow`
* De methode `registerPolicies`
* ULID-kolommen

***

## Upgradestappen

### Dependencies bijwerken

**Impact: hoog**

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

```json theme={null}
{
  "require": {
    "laravel/framework": "^10.0",
    "laravel/sanctum": "^3.2",
    "doctrine/dbal": "^3.0",
    "spatie/laravel-ignition": "^2.0"
  }
}
```

Gebruik je packages, werk die dan ook bij.

```json theme={null}
{
  "require": {
    "laravel/passport": "^11.0",
    "laravel/ui": "^4.0"
  }
}
```

Gebruik je PHPUnit 10, werk dan ook het volgende bij.

```json theme={null}
{
  "require-dev": {
    "nunomaduro/collision": "^7.0",
    "phpunit/phpunit": "^10.0"
  }
}
```

<Warning>
  Gebruik je PHPUnit 10, verwijder dan het attribuut `processUncoveredFiles` uit de `<coverage>`-sectie van `phpunit.xml`.
</Warning>

Installeer daarna de dependencies met het volgende commando.

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

Raadpleeg voor de upgrade van Sanctum 2.x naar 3.x ook de [Sanctum 3.x-upgradegids](https://github.com/laravel/sanctum/blob/3.x/UPGRADE.md).

***

### `minimum-stability` bijwerken

**Impact: hoog**

Werk `minimum-stability` in `composer.json` bij naar `stable`. Omdat de defaultwaarde `stable` is, mag je deze instelling ook verwijderen.

```json theme={null}
"minimum-stability": "stable"
```

***

## PHP-versievereiste

**Impact: hoog**

Laravel 10 vereist **PHP 8.1.0 of hoger** en **Composer 2.2.0 of hoger**.

***

## Breaking changes

### Applicatie

#### De public-path-binding

**Impact: laag**

Pas je het publieke pad aan door `path.public` aan de container te binden, gebruik dan voortaan de methode `usePublicPath` van `Illuminate\Foundation\Application`.

```php theme={null}
app()->usePublicPath(__DIR__.'/public');
```

***

### Autorisatie

#### De methode `registerPolicies`

**Impact: laag**

De methode `registerPolicies` van de `AuthServiceProvider` wordt nu automatisch door het framework aangeroepen. Je kunt de aanroep van deze methode uit je `boot`-methode verwijderen.

***

### Cache

#### Redis-cachetags

**Impact: middel**

`Cache::tags()` wordt alleen nog aanbevolen voor applicaties die Memcached gebruiken. Gebruik je Redis als cachedriver, overweeg dan een migratie naar Memcached.

***

### Database

#### Wijziging van database-expressies

**Impact: middel**

Database-expressies die met `DB::raw` worden gegenereerd zijn herschreven. Om de rauwe stringwaarde van een expressie op te halen, moet je nu de methode `getValue(Grammar $grammar)` gebruiken. Casten naar `(string)` is niet meer mogelijk.

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

$expression = DB::raw('select 1');

// Voorheen
$string = (string) $expression;

// Nu
$string = $expression->getValue(DB::connection()->getQueryGrammar());
```

Eindgebruikersapplicaties merken hier doorgaans niets van, maar cast je database-expressies naar strings, dan is een update nodig.

#### De `QueryException`-constructor

**Impact: zeer laag**

Aan de constructor van `Illuminate\Database\QueryException` is als eerste argument de verbindingsnaam (string) toegevoegd. Gooi je deze exceptie handmatig, pas je code dan aan.

#### ULID-kolommen

**Impact: laag**

Roep je in een migratie de methode `ulid` zonder argumenten aan, dan heet de kolom nu `ulid`. In eerdere releases werd bij een aanroep zonder argumenten per abuis een kolom met de naam `uuid` aangemaakt.

```php theme={null}
// De kolomnaam wordt "ulid"
$table->ulid();

// De kolomnaam expliciet opgeven
$table->ulid('ulid');
```

***

### Eloquent

#### De `$dates`-property van modellen

**Impact: middel**

De deprecated property `$dates` van Eloquent-modellen is verwijderd. Gebruik de property `$casts`.

```php theme={null}
// Voorheen
protected $dates = ['deployed_at'];

// Nu
protected $casts = [
    'deployed_at' => 'datetime',
];
```

***

### Lokalisatie

#### De taaldirectory

**Impact: geen**

Dit heeft geen invloed op bestaande applicaties, maar de skeleton van nieuwe Laravel-applicaties bevat standaard geen `lang`-directory meer. Indien nodig kun je hem publiceren met een Artisan-commando.

```shell theme={null}
php artisan lang:publish
```

***

### Logging

#### Monolog 3

**Impact: middel**

De Monolog-dependency van Laravel is bijgewerkt naar Monolog 3.x. Gebruik je Monolog direct in je applicatie, bekijk dan de [upgradegids van Monolog](https://github.com/Seldaek/monolog/blob/main/UPGRADE.md).

Gebruik je third-party loggingdiensten zoals BugSnag of Rollbar, dan kan een upgrade naar een versie die Monolog 3.x en Laravel 10.x ondersteunt nodig zijn.

<Tip>
  De wijzigingen in Monolog 3.x vind je in de [Monolog 3.x-upgradegids](https://github.com/Seldaek/monolog/blob/3.x/UPGRADE.md).
</Tip>

***

### Queue

#### Verwijdering van de methode `Bus::dispatchNow`

**Impact: laag**

De deprecated methodes `Bus::dispatchNow` en `dispatch_now` zijn verwijderd. Gebruik de methodes `Bus::dispatchSync` en `dispatch_sync`.

```php theme={null}
// Voorheen
Bus::dispatchNow(new MyJob());
dispatch_now(new MyJob());

// Nu
Bus::dispatchSync(new MyJob());
dispatch_sync(new MyJob());
```

***

### Routing

#### Middleware-aliassen

**Impact: optioneel**

In nieuwe Laravel-applicaties is de property `$routeMiddleware` van de klasse `App\Http\Kernel` hernoemd naar `$middlewareAliases`. Het toepassen hiervan op bestaande applicaties is optioneel.

#### De returnwaarde van de rate limiter

**Impact: laag**

Bij het aanroepen van de methode `RateLimiter::attempt` wordt nu de returnwaarde van de meegegeven closure ongewijzigd teruggegeven. Geef je niets of `null` terug, dan wordt `true` teruggegeven.

```php theme={null}
$value = RateLimiter::attempt('key', 10, fn () => ['example'], 1);

$value; // ['example']
```

#### Verwijdering van de methode `Redirect::home`

**Impact: zeer laag**

De deprecated methode `Redirect::home` is verwijderd. Redirect expliciet naar een benoemde route.

```php theme={null}
// Voorheen
return Redirect::home();

// Nu
return Redirect::route('home');
```

***

### Testen

#### Servicemocking

**Impact: middel**

De deprecated trait `MocksApplicationServices` is uit het framework verwijderd. Deze trait leverde testmethodes zoals `expectsEvents`, `expectsJobs` en `expectsNotifications`.

Gebruik je deze methodes, migreer dan naar respectievelijk `Event::fake`, `Bus::fake` en `Notification::fake`.

```php theme={null}
// Voorheen
$this->expectsEvents(OrderShipped::class);

// Nu
Event::fake();
// ... testcode ...
Event::assertDispatched(OrderShipped::class);
```

***

### Validatie

#### Berichten van closure-validatieregels

**Impact: zeer laag**

Roep je in een closure-gebaseerde custom validatieregel de `$fail`-callback meerdere keren aan, dan worden de berichten nu aan een array toegevoegd in plaats van overschreven.

Daarnaast geeft de `$fail`-callback nu een object terug. Typehint je de returnwaarde van je validatieclosure, dan moet je die bijwerken.

```php theme={null}
public function rules()
{
    return [
        'name' => [
            function ($attribute, $value, $fail) {
                $fail('validation.translation.key')->translate();
            },
        ],
    ];
}
```

#### De `after`-methode van form requests

**Impact: zeer laag**

De methode `after` binnen form requests is nu gereserveerd door Laravel. Definieer je een `after`-methode in een form request, hernoem die dan of pas hem aan om de nieuwe "after validation"-functionaliteit te benutten.

***

## Samenvatting

Laravel 10 bestaat uit relatief kleine wijzigingen en de upgrade is snel afgerond.

| Wijziging                                 | Impact    | Actie                                      |
| ----------------------------------------- | --------- | ------------------------------------------ |
| Dependencies in `composer.json` bijwerken | Hoog      | Wijzig naar `laravel/framework ^10.0`      |
| PHP 8.1 / Composer 2.2 vereist            | Hoog      | Controleer en werk de versies bij          |
| Wijziging van database-expressies         | Middel    | Wijzig `(string)`-casts naar `getValue()`  |
| Verwijdering van de `$dates`-property     | Middel    | Migreer naar `$casts`                      |
| Monolog 3                                 | Middel    | Bekijk de upgradegids bij direct gebruik   |
| Redis-cachetags                           | Middel    | Overweeg migratie naar Memcached           |
| `MocksApplicationServices` verwijderd     | Middel    | Migreer naar `Event::fake` e.d.            |
| `Bus::dispatchNow` verwijderd             | Laag      | Wijzig naar `Bus::dispatchSync`            |
| ULID-kolomnaam                            | Laag      | Controleer `ulid()`-aanroepen in migraties |
| `Redirect::home` verwijderd               | Zeer laag | Wijzig naar `Redirect::route('home')`      |

***

## Referenties

* [Officiële upgradegids (Engels)](https://laravel.com/docs/10.x/upgrade)
* [Diff van de laravel/laravel-repository (9.x → 10.x)](https://github.com/laravel/laravel/compare/9.x...10.x)
* [Laravel Shift](https://laravelshift.com) — communitydienst die upgrades automatiseert
* [Sanctum-upgradegids (2.x → 3.x)](https://github.com/laravel/sanctum/blob/3.x/UPGRADE.md)
* [Monolog 3.x-upgradegids](https://github.com/Seldaek/monolog/blob/3.x/UPGRADE.md)


## Related topics

- [Upgraden van Laravel 10 naar 11](/nl/blog/upgrade-10-to-11.md)
- [Upgraden van Laravel 8 naar 9](/nl/blog/upgrade-8-to-9.md)
- [Upgradegids van Laravel 12 naar 13](/nl/blog/upgrade-12-to-13.md)
- [Upgradegids van Laravel 11 naar 12](/nl/blog/upgrade-11-to-12.md)
- [Migratiegids van laravel/ui naar Fortify](/nl/blog/ui-to-fortify.md)
