
# Workflow-skabeloner

Workflow-skabeloner lader dig definere et workflows trinstruktur én gang og starte det flere gange efter navn. Det er nyttigt, når den samme proces med flere trin skal køre med forskellige nyttelaster.

## Definition af en skabelon

Brug `Queuety::define_workflow()` til at opbygge skabelonen, og registrer den derefter:

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

Registrer skabeloner tidligt, for eksempel i et plugins initialiseringshook:

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

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

## Kørsel af en skabelon

Start en registreret skabelon efter navn med `Queuety::run_workflow()`:

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

Det andet argument er den indledende nyttelast/tilstand, ligesom `->dispatch()` på en builder. Det returnerede heltal er workflow-id'et.

Hvis skabelonen ikke er registreret, udløses en `RuntimeException`.

## Visning af registrerede skabeloner

Få adgang til skabelonregistret:

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

## Fuldt eksempel

```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' ] );
```

## Skabeloner sammenlignet med inline-workflows

| | Inline-workflow | Skabelon |
|---|---|---|
| Definition | Ved start | Én gang ved registrering |
| Start | `Queuety::workflow('name')->then(...)->dispatch()` | `Queuety::run_workflow('name', $payload)` |
| Genbrug | Opbyg kæden hver gang | Registrer én gang, start mange gange |
| Bedst til | Engangsworkflows eller workflows sammensat dynamisk | Standardiserede, gentagelige processer |
