Přejít k obsahu

Workflow v jediném souboru

Workflow může být kompletně samostatné v jednom souboru PHP. Definujte v něm společně třídy kroků i builder, uložte soubor do adresáře a načtěte tento adresář pomocí Queuety::load_workflows() (viz níže). Queuety samo žádný adresář neprohledává.

PHP
// workflows/onboard-user.php
use Queuety\Queuety;

class CreateAccount implements \Queuety\Step {
    public function handle(array $state): array {
        $user = create_user($state['email']);
        return ['user_id' => $user->id, 'user_name' => $user->name];
    }
    public function config(): array {
        return ['max_attempts' => 3];
    }
}

class SendWelcome implements \Queuety\Step {
    public function handle(array $state): array {
        wp_mail($state['email'], 'Welcome ' . $state['user_name'], '...');
        return ['welcomed' => true];
    }
    public function config(): array {
        return [];
    }
}

return Queuety::define_workflow('onboard_user')
    ->then(CreateAccount::class, 'create_account')
    ->then(SendWelcome::class, 'send_welcome');

Soubor vrací WorkflowBuilder. Každá třída kroku je definována přímo v něm. Po načtení jsou třídy k dispozici a workflow se zaregistruje jako šablona.

Načítání workflow

Načtěte všechny soubory workflow z adresáře:

PHP
// Load all .php files from the workflows directory
$count = Queuety::load_workflows(__DIR__ . '/workflows/');

Nebo načtěte jeden soubor:

PHP
$template = Queuety::load_workflow_file(__DIR__ . '/workflows/onboard-user.php');

Pak workflow spusťte podle názvu:

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

Rekurzivní načítání

Předejte true jako druhý argument a prohledejte podadresáře:

PHP
Queuety::load_workflows(__DIR__ . '/workflows/', recursive: true);

Takto můžete workflow uspořádat do složek:

Kód
workflows/
├── onboarding/
│   ├── new-user.php
│   └── trial-upgrade.php
├── reports/
│   ├── daily-summary.php
│   └── weekly-digest.php
└── notifications/
    └── digest-email.php

Využití všech funkcí workflow

Workflow v souborech podporují vše, co nabízí builder, kromě idempotency_key(), které se do šablony neukládá; předejte ho při spuštění pomocí Queuety::run_workflow( $name, $payload, [ 'idempotency_key' => '...' ] ). Fungují také zpoždění, signály, paralelní kroky, podmíněné větvení, spouštění dalších workflow, obslužné rutiny zrušení i prořezávání stavu:

PHP
// workflows/approval-flow.php
use Queuety\Queuety;

class SubmitRequest implements \Queuety\Step {
    public function handle(array $state): array {
        return ['submitted_at' => date('Y-m-d H:i:s')];
    }
    public function config(): array { return []; }
}

class ProcessApproval implements \Queuety\Step {
    public function handle(array $state): array {
        return [
            'approved_by' => $state['approved_by'],
            'processed' => true,
        ];
    }
    public function config(): array { return []; }
}

class CleanupRequest implements \Queuety\Handler {
    public function handle(array $payload): void {
        delete_pending_request($payload['request_id']);
    }
    public function config(): array { return []; }
}

return Queuety::define_workflow('approval_flow')
    ->then(SubmitRequest::class)
    ->delay(hours: 24)
    ->wait_for_signal('approved')
    ->then(ProcessApproval::class)
    ->on_cancel(CleanupRequest::class)
    ->prune_state_after(2);

Kdy používat workflow v souborech

Workflow v souborech se hodí, když:

  • LLM nebo generátor kódu vytváří workflow programově
  • Workflow je natolik jednoduché, že se vejde do jednoho souboru
  • Chcete mít logiku kroků blízko definice workflow
  • Vytváříte prototyp a chcete rychle iterovat

U rozsáhlejších workflow se sdílenými třídami kroků, složitým middlewarem nebo kroky používanými ve více workflow je udržovatelnější standardní přístup se samostatnými soubory tříd a automatickým načítáním PSR-4.

Jak to funguje

Workflow v souborech pod kapotou používají přesně stejný engine jako builder API. Každý krok je samostatnou úlohou v databázi. Stav se předává přes tabulku queuety_workflows. Neprobíhá zde přehrávání, není vyžadována determinističnost a výkon se neliší.

Každé volání načítací funkce require daný soubor (nikoli require_once), proto každý soubor načtěte jednou za požadavek; dvojí načtení znovu deklaruje jeho třídy a skončí chybou. Vrácený objekt WorkflowBuilder se převede na WorkflowTemplate a uloží do WorkflowRegistry. Spouštění i provádění jsou stejné jako u ostatních workflow.