
# Workflowtemplates

Met workflowtemplates definieer je de stappenstructuur van een workflow één keer en start je die vervolgens meerdere keren op naam. Dit is handig wanneer hetzelfde proces met meerdere stappen met verschillende payloads moet worden uitgevoerd.

## Een template definiëren

Gebruik `Queuety::define_workflow()` om de template op te bouwen en registreer deze vervolgens:

```php
use Queuety\Queuety;
use Queuety\Enums\Priority;

$builder = Queuety::define_workflow( 'onboarding' )
    ->on_queue( 'pipelines' )
    ->with_priority( Priority::Normal )
    ->max_attempts( 5 )
    ->then( CreateAccountHandler::class )
    ->then( SendWelcomeEmailHandler::class )
    ->then( NotifyAdminHandler::class );

Queuety::register_workflow_template( $builder );
```

Registreer templates vroeg, bijvoorbeeld in een initialisatiehook van een plugin:

```php
add_action( 'init', function () {
    $builder = Queuety::define_workflow( 'onboarding' )
        ->then( CreateAccountHandler::class )
        ->then( SendWelcomeEmailHandler::class )
        ->then( NotifyAdminHandler::class );

    Queuety::register_workflow_template( $builder );
} );
```

## Een template uitvoeren

Start een geregistreerde template op naam met `Queuety::run_workflow()`:

```php
$workflow_id = Queuety::run_workflow( 'onboarding', [ 'email' => 'user@example.com' ] );
```

Het tweede argument is de initiële payload/status, net als `->dispatch()` op een builder. Het geretourneerde gehele getal is de workflow-ID.

Als de template niet is geregistreerd, wordt een `RuntimeException` gegenereerd.

## Geregistreerde templates weergeven

Open het template-register:

```php
$registry = Queuety::workflow_templates();
$template = $registry->get( 'onboarding' ); // WorkflowTemplate or null
```

## Volledig voorbeeld

```php
// Register templates on init.
add_action( 'init', function () {
    // User onboarding pipeline
    $onboarding = Queuety::define_workflow( 'onboarding' )
        ->on_queue( 'users' )
        ->then( CreateAccountHandler::class )
        ->then( SetupDefaultsHandler::class )
        ->then( SendWelcomeEmailHandler::class );
    Queuety::register_workflow_template( $onboarding );

    // Content generation pipeline
    $content = Queuety::define_workflow( 'generate_content' )
        ->on_queue( 'llm' )
        ->max_attempts( 5 )
        ->then( BuildPromptHandler::class )
        ->then( CallLLMHandler::class )
        ->then( ReviewOutputHandler::class )
        ->then( PublishHandler::class );
    Queuety::register_workflow_template( $content );
} );

// Dispatch them anywhere in your application.
$wf1 = Queuety::run_workflow( 'onboarding', [ 'email' => 'alice@example.com' ] );
$wf2 = Queuety::run_workflow( 'generate_content', [ 'topic' => 'WordPress performance' ] );
```

## Templates versus inline workflows

| | Inline workflow | Template |
|---|---|---|
| Definitie | Op het moment van starten | Eenmalig, bij registratie |
| Starten | `Queuety::workflow('name')->then(...)->dispatch()` | `Queuety::run_workflow('name', $payload)` |
| Hergebruik | Bouw de keten elke keer opnieuw | Eenmalig registreren, meerdere keren starten |
| Geschikt voor | Eenmalige of dynamisch samengestelde workflows | Standaardprocessen die herhaald kunnen worden |
