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

# Laravel Doctor — een diagnosetool voor applicaties

> Een introductie van laravel/doctor: het officiële Laravel-pakket dat veelvoorkomende problemen in configuratie, omgeving en infrastructuur diagnosticeert en de veilige gevallen automatisch herstelt. Uit te voeren met het commando php artisan doctor. Uitgebracht op 28 juli 2026.

## Inleiding

[laravel/doctor](https://github.com/laravel/doctor) is een officieel pakket dat veelvoorkomende problemen met configuratie, omgeving en infrastructuur in Laravel-applicaties diagnosticeert. Op 28 juli 2026 werd v0.1.0 uitgebracht.

Elke diagnostic is één enkele check. Zo controleert er bijvoorbeeld een of "Laravel naar de storage-directory kan schrijven", en wordt een van meerdere statussen gerapporteerd. Kan iets veilig en deterministisch worden gerepareerd, dan wordt ook een automatische fix aangeboden; voor problemen die niet automatisch te herstellen zijn, zoals een mislukte assetbuild, worden herstelinstructies (remediation) getoond.

```bash theme={null}
composer require laravel/doctor --dev
```

## Uitvoeren

Na de installatie is het Artisan-commando `doctor` geregistreerd.

```bash theme={null}
php artisan doctor
```

Vindt Doctor een herstelbaar probleem, dan rapporteert hij het probleem en vraagt hij om bevestiging voor de fix.

```text theme={null}
Storage is writable: The application cannot write to every required storage directory.

 Make the storage directories writable? (yes/no) [yes]
```

Wil je fixes zonder bevestiging toepassen, gebruik dan de optie `--fix`.

```bash theme={null}
php artisan doctor --fix
```

De standaardfixes dekken deterministische lokale reparaties, zoals het aanmaken van `.env`, het genereren van een `APP_KEY`, het uitschakelen van de debugmodus in productie, het toevoegen van `.env` aan `.gitignore`, het aanmaken van `storage:link` en het herstellen van schrijfrechten op de storage-directories.

<Info>
  De fixfunctionaliteit is alleen beschikbaar in de CLI- en agent-uitvoerformaten. In de JSON- en GitHub-rapportformaten wordt `--fix` geweigerd, zodat machineleesbare rapporten de applicatie niet wijzigen.
</Info>

Met `--bail` stopt de uitvoering bij de eerste diagnostic die faalt of een fout geeft.

```bash theme={null}
php artisan doctor --bail
```

## Diagnostische statussen

Elke diagnostic retourneert een van de volgende statussen.

| Status   | Betekenis                                                        | Invloed op de exitcode      |
| -------- | ---------------------------------------------------------------- | --------------------------- |
| `pass`   | Check geslaagd, geen probleem                                    | Nee                         |
| `notice` | Informatie die het waard is om aan de ontwikkelaar te melden     | Nee                         |
| `warn`   | Een potentieel probleem waarbij actie soms onnodig is            | Alleen bij `--fail-on=warn` |
| `fail`   | Een op te lossen probleem gedetecteerd                           | Ja                          |
| `skip`   | Niet van toepassing op de huidige omgeving                       | Nee                         |
| `error`  | Er trad een exception op tijdens het uitvoeren van de diagnostic | Ja                          |

Standaard eindigt het commando met een foutstatus bij een `fail` of `error`. Met `--fail-on=warn` laat je ook waarschuwingen falen, en met `--fail-on=never` blijft het bij alleen rapporteren.

## Diagnostics selecteren

Je kunt diagnostics selecteren en uitsluiten op klassenaam, groep, pakket of pakket-wildcard.

```bash theme={null}
php artisan doctor --only=storage

php artisan doctor --only=StorageIsWritable

php artisan doctor --except=laravel/*
```

Publiceer je het configuratiebestand, dan kun je de selectie ook permanent instellen.

```bash theme={null}
php artisan vendor:publish --tag=doctor-config
```

## Omgevingsmodi

Een `sync`-queue is bij lokale ontwikkeling een redelijke standaard, maar in productie betekent het dat queue-jobs synchroon binnen het webrequest worden uitgevoerd. Voor dit soort beslissingen lost Doctor je applicatie op naar een van twee modi: `local` of `production`.

| Modus        | Verwachte toestand                                                                                                                           |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------- |
| `local`      | In ontwikkeling. Debugmodus, `sync`-queue en niet-gecachte bootstrapbestanden zijn normaal                                                   |
| `production` | Verwerkt echt verkeer. Debugmodus is een beveiligingsrisico, queues horen asynchroon te draaien en bootstrapbestanden horen gecachet te zijn |

De standaard Laravel-omgevingsnamen `local`, `production` en `staging` worden automatisch herkend. Gebruik je andere namen, dan groepeer je ze in het configuratiebestand per modus.

```php theme={null}
'environments' => [
    'local' => ['local', 'dev'],
    'production' => ['production', 'staging', 'qa'],
],
```

## Standaarddiagnostics

Doctor wordt standaard geleverd met een diagnosesuite die onder meer het volgende omvat.

* **Omgeving** — het bestaan van `.env`, `APP_KEY`, de PHP-versie, vereiste extensies, tijdzone
* **Composer** — installatiestatus van de dependencies, autoload-optimalisatie, automatisch herstel van `composer.lock`
* **Configuratie** — of configuratiebestanden geladen en gecachet kunnen worden, configuratiewaarden die actieve drivers nodig hebben
* **Database** — bereikbaarheid van de verbinding, het bestaan van het SQLite-bestand, automatisch toepassen van openstaande migrations
* **Cache, queue, scheduler en sessie** — bereikbaarheid van de geconfigureerde drivers, detectie van een `sync`-queue buiten productie
* **Storage** — bereikbaarheid van de standaarddisk, schrijfrechten op de vereiste directories, het bestaan van `storage:link`
* **Beveiliging** — consistentie tussen debugmodus en omgeving, registratie van `.env` in `.gitignore`, audit van de Composer-dependencies

## Eigen diagnostics maken

Je maakt een eigen diagnosticklasse door simpelweg `Laravel\Doctor\Diagnostic` te extenden en de methode `check()` te implementeren. Scaffolden kan met het Artisan-commando `make:diagnostic`.

```bash theme={null}
php artisan make:diagnostic HorizonIsRunning --fixable
```

Hieronder een voorbeeld van een diagnostic die controleert of `APP_KEY` is ingesteld en deze automatisch genereert als dat niet zo is.

```php theme={null}
namespace App\Doctor\Diagnostics;

use Illuminate\Support\Facades\Artisan;
use Laravel\Doctor\Contracts\Fixable;
use Laravel\Doctor\Diagnostic;
use Laravel\Doctor\EnvironmentMode;
use Laravel\Doctor\Results\DiagnosticResult;
use Laravel\Doctor\Results\FixResult;

class ApplicationKeyIsSet extends Diagnostic implements Fixable
{
    public string $name = 'App key is set';

    public string $group = 'environment';

    protected function messages(): array
    {
        return [
            'configured' => 'The application key is configured.',
            'missing' => 'The application key is not configured.',
            'generated' => 'The application key was generated.',
        ];
    }

    public function check(): DiagnosticResult
    {
        $key = config('app.key');

        if (is_string($key) && trim($key) !== '') {
            return $this->pass('configured');
        }

        return $this->fail('missing')->fixable(EnvironmentMode::Local);
    }

    public function fix(DiagnosticResult $result): FixResult
    {
        Artisan::call('key:generate', ['--force' => true]);

        return $this->fixed('generated');
    }
}
```

Is een fix met keuzemogelijkheden zinvol, dan declareer je de opties met `fixOptions()`. De CLI toont dit als keuzelijst, en de gekozen waarde wordt doorgegeven aan `fix()`.

```php theme={null}
return $this->fail('unreachable')
    ->fixable(EnvironmentMode::Local)
    ->fixOptions(['file' => 'File', 'redis' => 'Redis']);
```

Aan het einde van de keuzelijst wordt altijd een optie toegevoegd om de fix over te slaan (standaard `Skip — leave unfixed`). Is een formulering die de huidige keuze behoudt duidelijker, dan kun je een `decline`-label opgeven.

```php theme={null}
->fixOptions(['file' => 'File'], decline: 'Keep Redis (repair it manually)');
```

### Diagnostische helpers

Omdat veel applicaties en pakketten steeds dezelfde soorten checks schrijven, biedt Doctor in de namespace `Laravel\Doctor\Support` helpers voor veelvoorkomende patronen.

De `Configured`-helper leest configuratiewaarden defensief. Omdat diagnostics ook applicaties met kapotte configuratie moeten kunnen inspecteren zonder vóór het rapporteren een exception te gooien, gooien deze methoden — anders dan de getypeerde accessors van de configuratierepository — geen exceptions bij onverwachte types.

```php theme={null}
use Laravel\Doctor\Support\Configured;

$connection = Configured::string('queue.default', 'database');

$missing = Configured::missing([
    'services.stripe.key',
    'services.stripe.secret',
]);
```

De `ActiveDrivers`-helper lost wrapperdrivers — zoals een standaardlogkanaal dat `stack` is of een mailer die `failover` is — op naar de concrete kanalen of mailers die daadwerkelijk worden gebruikt.

```php theme={null}
use Laravel\Doctor\Support\ActiveDrivers;

$channels = ActiveDrivers::logChannels(Configured::string('logging.default', 'stack'));

$mailers = ActiveDrivers::mailers(Configured::string('mail.default', 'log'));
```

De `Details`-helper formatteert bewijsinformatie die je aan `withDetails()` hangt. `Details::bullets()` maakt van een lijst strings een opsomming, `Details::failures()` verwerkt foutmeldingen met sleutels, en `Details::processOutput()` kiest de meest bruikbare outputstream van een voltooid proces.

```php theme={null}
use Laravel\Doctor\Support\Details;

Details::bullets(['services.stripe.key', 'services.stripe.secret']);

Details::failures(['media' => 'The disk root is not writable.']);
```

Ook pakketten kunnen met dezelfde API diagnostics registreren vanuit hun serviceprovider.

```php theme={null}
use Laravel\Doctor\Facades\Doctor;
use Vendor\Package\Diagnostics\HorizonIsRunning;

public function boot(): void
{
    Doctor::diagnostic(HorizonIsRunning::class);
}
```

In het rapport wordt getoond uit welk pakket de diagnostic afkomstig is.

```text theme={null}
[fail] Storage is writable (laravel/doctor): The application cannot write to every required storage directory.
[warn] Horizon is running (laravel/horizon): Horizon is not currently running.
```

## Programmatisch uitvoeren

Je kunt ook `Doctor::run()` aanroepen zonder het Artisan-commando te gebruiken.

```php theme={null}
use Laravel\Doctor\Facades\Doctor;

$report = Doctor::only('security')
    ->except(SomeDiagnostic::class)
    ->run();

if ($report->hasFailures()) {
    // ...
}
```

Wil je bij programmatische uitvoering ook fixes toepassen, stel dan `fixUsing` in. De callback ontvangt de gefaalde diagnostic die een fix aanbiedt; retourneer `false` om over te slaan, `true` om de normale fix toe te passen, of de waarde van een fixoptie om die keuze toe te passen. Wordt een fix toegepast, dan voert Doctor de diagnostic opnieuw uit om dit in het rapport te verwerken.

```php theme={null}
$report = Doctor::fixUsing(
    fn ($outcome) => $outcome->fixRequiresOption() ? false : true,
)->run();

$report->fixes();
```

## Uitvoerformaten en ondersteuning voor AI-agents

Doctor toont standaard goed leesbare CLI-output, maar je kunt ook kiezen voor JSON of het annotatieformaat van GitHub Actions.

```bash theme={null}
php artisan doctor --format=json

php artisan doctor --format=github
```

Wordt via de [Laravel Agent Detector](https://github.com/laravel/agent-detector) gedetecteerd dat het commando binnen een AI-codeeragent zoals Claude Code of Cursor draait, dan wordt standaard het agentgeoptimaliseerde formaat gebruikt dat dezelfde conventies volgt als [Laravel PAO](https://github.com/laravel/pao).

```json theme={null}
{"tool":"doctor","result":"failed","diagnostics":27,"failed":1,"warnings":1,"notices":0,"passed":19,"skipped":6,"issues":[{"name":".env file exists","status":"fail","summary":"The application does not have an environment file.","fix":"Run `cp .env.example .env`, then review the copied values.","fixable":true}]}
```

Problemen met `fixable: true` kun je herstellen door opnieuw uit te voeren met `--fix`. Wil je dit formaat buiten een agent proberen, voer dan `AI_AGENT=test php artisan doctor` uit.

## Conclusie

Met `laravel/doctor` breng je problemen in de configuratie, omgeving en infrastructuur van je applicatie snel in kaart door alleen `php artisan doctor` uit te voeren. Het pakket sluit ook goed aan bij AI-codeeragents: het retourneert output die agents makkelijk interpreteren volgens dezelfde conventies als Laravel PAO, waardoor het de moeite waard is om het op te nemen in CI/CD of in automatische herstelworkflows met AI-agents.

<Card title="laravel/doctor repository" icon="github" href="https://github.com/laravel/doctor">
  De broncode en het laatste nieuws vind je hier.
</Card>


## Related topics

- [Laravel Pint](/nl/pint.md)
- [laravel/symfony-on-cloud — Symfony-apps draaien op Laravel Cloud](/nl/blog/symfony-on-cloud-introduction.md)
- [Een SPA bouwen met Inertia.js](/nl/blog/inertia-introduction.md)
- [Upgraden van Laravel 9 naar 10](/nl/blog/upgrade-9-to-10.md)
- [Introductie React — de basis voor Inertia × Laravel](/nl/blog/react-introduction.md)
