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

# Upgradegids van Laravel 11 naar 12

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

## Inleiding

Laravel 12 is uitgebracht in februari 2025. Deze gids beschrijft de stappen om te upgraden van Laravel 11.x naar 12.x.

<Info>
  De geschatte tijd voor de upgrade is **ongeveer 5 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
* De Laravel installer bijwerken

### Impact: middel

* De Eloquent `HasUuids`-trait en UUIDv7

### Impact: laag

* Carbon 3
* Resultaatindex-mapping van Concurrency
* Klasse-afhankelijkheden oplossen in de container
* SVG uitgesloten bij afbeeldingsvalidatie
* Standaard rootpad van de lokale filesystem-disk
* Multi-schema database-inspectie
* Mergen van geneste array-requests

***

## Upgradestappen

### Dependencies bijwerken

**Impact: hoog**

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

```json theme={null}
{
  "require": {
    "laravel/framework": "^12.0"
  },
  "require-dev": {
    "phpunit/phpunit": "^11.0",
    "pestphp/pest": "^3.0"
  }
}
```

Installeer daarna de dependencies met het volgende commando.

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

***

### De Laravel installer bijwerken

**Impact: hoog**

Gebruik je de Laravel installer CLI om nieuwe Laravel-applicaties aan te maken, werk hem dan bij naar een versie die Laravel 12.x en de [nieuwe starter kits](https://laravel.com/starter-kits) ondersteunt.

Geïnstalleerd via `composer global require`:

```shell theme={null}
composer global update laravel/installer
```

Geïnstalleerd via `php.new`? Voer dan het herinstallatiecommando voor jouw besturingssysteem uit.

<Tabs>
  <Tab title="macOS">
    ```shell theme={null}
    /bin/bash -c "$(curl -fsSL https://php.new/install/mac/8.4)"
    ```
  </Tab>

  <Tab title="Windows PowerShell">
    ```shell theme={null}
    # Uitvoeren als administrator
    Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://php.new/install/windows/8.4'))
    ```
  </Tab>

  <Tab title="Linux">
    ```shell theme={null}
    /bin/bash -c "$(curl -fsSL https://php.new/install/linux/8.4)"
    ```
  </Tab>
</Tabs>

Gebruik je de gebundelde versie van [Laravel Herd](https://herd.laravel.com), werk Herd zelf dan bij naar de nieuwste release.

***

## De nieuwe starter kits

Laravel 12 introduceerde nieuwe starter kits die de klassieke Breeze en Jetstream vervangen. Voer je `laravel new` uit, dan kun je interactief een frontendstack kiezen.

Beschikbare starter kits:

* **React** — Inertia 2, React 19, TypeScript, Tailwind 4, shadcn/ui
* **Vue** — Inertia 2, Vue Composition API, TypeScript, Tailwind 4, shadcn-vue
* **Svelte** — Inertia 2, Svelte 5, TypeScript, Tailwind 4, shadcn-svelte
* **Livewire** — Livewire, Tailwind 4, Flux UI

```shell theme={null}
laravel new my-app
```

Bij het uitvoeren van het commando word je gevraagd een starter kit te kiezen. Daarna hoef je alleen nog de dependencies te installeren en de ontwikkelserver te starten.

```shell theme={null}
cd my-app
npm install && npm run build
composer run dev
```

<Info>
  Upgrade je een bestaande applicatie, dan hoef je geen starter kit opnieuw op te zetten. Deze wijziging is bedoeld voor nieuwe projecten.
</Info>

***

## Breaking changes

### Eloquent

#### De `HasUuids`-trait en UUIDv7

**Impact: middel**

De `HasUuids`-trait geeft nu UUID v7 (geordende UUID's) terug. Wil je het eerdere gedrag met geordende UUID v4 behouden, stap dan over op de trait `HasVersion4Uuids`.

```php theme={null}
use Illuminate\Database\Eloquent\Concerns\HasUuids; // [tl! remove]
use Illuminate\Database\Eloquent\Concerns\HasVersion4Uuids as HasUuids; // [tl! add]
```

Gebruikte je al de trait `HasVersion7Uuids`, wijzig die dan naar de trait `HasUuids` (die zich nu hetzelfde gedraagt).

***

### Validatie

#### SVG uitgesloten bij afbeeldingsvalidatie

**Impact: laag**

De validatieregel `image` staat standaard geen SVG's meer toe. Wil je SVG's toestaan, geef dat dan expliciet op.

```php theme={null}
use Illuminate\Validation\Rules\File;

'photo' => 'required|image:allow_svg'

// Of
'photo' => ['required', File::image(allowSvg: true)],
```

***

### Storage

#### Standaard rootpad van de lokale filesystem-disk

**Impact: laag**

Als je de `local`-disk niet expliciet definieert in de `filesystems`-configuratie, is het standaard rootpad gewijzigd van `storage/app` naar `storage/app/private`.

Om het eerdere gedrag te behouden, definieer je de `local`-disk expliciet in het configuratiebestand.

```php theme={null}
// config/filesystems.php
'local' => [
    'driver' => 'local',
    'root' => storage_path('app'),
],
```

***

### Database

#### Multi-schema database-inspectie

**Impact: laag**

`Schema::getTables()`, `Schema::getViews()` en `Schema::getTypes()` geven nu standaard de resultaten van alle schema's terug. Wil je alleen een specifiek schema, geef dan het argument `schema` mee.

```php theme={null}
// Tabellen van alle schema's
$tables = Schema::getTables();

// Alleen tabellen van het schema 'main'
$tables = Schema::getTables(schema: 'main');
```

`Schema::getTableListing()` geeft nu standaard schema-gekwalificeerde tabelnamen terug.

```php theme={null}
$tables = Schema::getTableListing();
// ['main.migrations', 'main.users', 'blog.posts']

$tables = Schema::getTableListing(schema: 'main', schemaQualified: false);
// ['migrations', 'users']
```

#### Wijziging van database-constructorsignaturen

**Impact: zeer laag**

De constructors van `Illuminate\Database\Schema\Blueprint` en `Illuminate\Database\Grammar` vereisen nu een `Connection`-instantie als eerste argument.

```php theme={null}
// Laravel <= 11.x
$grammar = new MySqlGrammar;
$grammar->setConnection($connection);

// Laravel >= 12.x
$grammar = new MySqlGrammar($connection);
```

Daarnaast zijn de volgende API's verwijderd of deprecated.

| API                                              | Status     |
| ------------------------------------------------ | ---------- |
| `Blueprint::getPrefix()`                         | Deprecated |
| `Connection::withTablePrefix()`                  | Verwijderd |
| `Grammar::getTablePrefix()` / `setTablePrefix()` | Deprecated |
| `Grammar::setConnection()`                       | Verwijderd |

Haal de tabelprefix direct op via de connection.

```php theme={null}
$prefix = $connection->getTablePrefix();
```

***

### Concurrency

#### Resultaatindex-mapping

**Impact: laag**

Geef je een associatieve array door aan `Concurrency::run()`, dan worden de resultaten nu teruggegeven onder de bijbehorende keys.

```php theme={null}
$result = Concurrency::run([
    'task-1' => fn () => 1 + 1,
    'task-2' => fn () => 2 + 2,
]);

// ['task-1' => 2, 'task-2' => 4]
```

***

### Container

#### Standaardwaarden bij het oplossen van klasse-afhankelijkheden

**Impact: laag**

De DI-container respecteert nu de standaardwaarden van klasseproperties bij het oplossen van klasse-instanties.

```php theme={null}
class Example
{
    public function __construct(public ?Carbon $date = null) {}
}

$example = resolve(Example::class);

// Laravel <= 11.x: geeft een Carbon-instantie terug
// Laravel >= 12.x: geeft null terug
```

***

### Requests

#### Mergen van geneste array-requests

**Impact: laag**

Met `$request->mergeIfMissing()` kun je nu geneste arraydata mergen met dot-notatie. Voorheen werden dot-notatiekeys letterlijk als toplevel-keys aangemaakt.

```php theme={null}
$request->mergeIfMissing([
    'user.last_name' => 'Otwell',
]);
```

***

### Routing

#### Routeprioriteit

**Impact: laag**

Het gedrag bij meerdere routes met dezelfde naam is nu uniform, met en zonder cache. Ook bij routing zonder cache krijgt nu de eerst geregistreerde route voorrang in plaats van de laatste.

***

### Authenticatie

#### Wijziging van de `DatabaseTokenRepository`-constructor

**Impact: zeer laag**

De constructor van `Illuminate\Auth\Passwords\DatabaseTokenRepository` neemt de parameter `$expires` nu aan in seconden in plaats van minuten.

***

### Carbon 3

**Impact: laag**

De ondersteuning voor Carbon 2.x is verwijderd. Alle Laravel 12-applicaties vereisen [Carbon 3.x](https://carbon.nesbot.com/guide/getting-started/migration.html).

***

## Samenvatting

Laravel 12 is een versie waarnaar je relatief soepel kunt upgraden. De belangrijkste aandachtspunten:

| Wijziging                                   | Impact | Actie                                            |
| ------------------------------------------- | ------ | ------------------------------------------------ |
| Dependencies in `composer.json` bijwerken   | Hoog   | Wijzig naar `laravel/framework ^12.0`            |
| De Laravel installer bijwerken              | Hoog   | `composer global update`                         |
| `HasUuids` → UUIDv7                         | Middel | Stap indien nodig over op `HasVersion4Uuids`     |
| SVG uitgesloten bij `image`-validatie       | Laag   | Voeg `allow_svg` toe als je SVG's wilt toestaan  |
| Gewijzigde standaardroot van de lokale disk | Laag   | Geef het expliciet op in het configuratiebestand |
| Carbon 3 vereist                            | Laag   | Controleer de API-compatibiliteit                |

***

## Referenties

* [Officiële upgradegids (Engels)](https://laravel.com/docs/12.x/upgrade)
* [Diff van de laravel/laravel-repository (11.x → 12.x)](https://github.com/laravel/laravel/compare/11.x...12.x)
* [De nieuwe starter kits](https://laravel.com/starter-kits)
* [Laravel Shift](https://laravelshift.com) — communitydienst die upgrades automatiseert
* [Carbon 3-migratiegids](https://carbon.nesbot.com/guide/getting-started/migration.html)


## Related topics

- [Upgradegids van Laravel 12 naar 13](/nl/blog/upgrade-12-to-13.md)
- [Upgraden van Laravel 10 naar 11](/nl/blog/upgrade-10-to-11.md)
- [Migratiegids van oude naar nieuwe structuur](/nl/advanced/app-structure-migration.md)
- [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)
