Workflowy v jednom súbore
Workflow môže byť úplne samostatný v jednom súbore PHP. Definujte triedy krokov spolu s builderom, vložte súbor do adresára a načítajte tento adresár pomocou Queuety::load_workflows() (nižšie). Queuety sám od seba neprehľadáva žiadny adresár.
// 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');
Súbor vracia WorkflowBuilder. Každá trieda kroku je definovaná priamo v ňom. Po načítaní súboru budú triedy dostupné a workflow sa zaregistruje ako šablóna.
Načítavanie workflowov
Načítajte všetky súbory workflowov z adresára:
// Load all .php files from the workflows directory
$count = Queuety::load_workflows(__DIR__ . '/workflows/');
Alebo načítajte jeden súbor:
$template = Queuety::load_workflow_file(__DIR__ . '/workflows/onboard-user.php');
Potom spustite workflow podľa názvu:
$workflow_id = Queuety::run_workflow('onboard_user', ['email' => 'user@example.com']);
Rekurzívne načítavanie
Ak chcete prehľadávať podadresáre, odovzdajte true ako druhý argument:
Queuety::load_workflows(__DIR__ . '/workflows/', recursive: true);
Vďaka tomu môžete workflowy usporiadať do priečinkov:
workflows/
├── onboarding/
│ ├── new-user.php
│ └── trial-upgrade.php
├── reports/
│ ├── daily-summary.php
│ └── weekly-digest.php
└── notifications/
└── digest-email.php
Využitie všetkých funkcií workflowov
Workflowy definované v súboroch podporujú všetko, čo podporuje builder, okrem idempotency_key(), ktoré sa neukladá do šablóny; namiesto toho ho odovzdajte pri každom spustení pomocou Queuety::run_workflow( $name, $payload, [ 'idempotency_key' => '...' ] ). Fungujú oneskorenia, signály, paralelné kroky, podmienené vetvenie, spúšťanie workflowov, obslužné rutiny zrušenia aj orezávanie stavu:
// 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);
Kedy používať workflowy definované v súboroch
Workflowy definované v súboroch sú ideálne, keď:
- LLM alebo generátor kódu vytvára workflowy programovo
- Workflow je natoľko jednoduchý, že sa zmestí do jedného súboru
- Chcete mať logiku krokov blízko definície workflowu
- Vytvárate prototyp a chcete rýchlo opakovať úpravy
Pri väčších workflowoch so zdieľanými triedami krokov, zložitým middleware alebo krokmi opakovane používanými vo viacerých workflowoch sa lepšie udržiava štandardný prístup so samostatnými súbormi tried a automatickým načítavaním PSR-4.
Ako to funguje
Workflowy definované v súboroch na pozadí používajú presne ten istý engine ako builder API. Každý krok je v databáze samostatnou úlohou. Stav sa prenáša prostredníctvom tabuľky queuety_workflows. Nevykonáva sa opätovné prehrávanie, nevyžaduje sa deterministickosť a výkon sa nelíši.
Každé volanie na načítanie require súbor (nie require_once), preto každý súbor načítajte raz za požiadavku; pri druhom načítaní sa jeho triedy deklarujú znova a dôjde k chybe. Vrátené WorkflowBuilder sa prevedie na WorkflowTemplate a uloží do WorkflowRegistry. Spúšťanie aj vykonávanie fungujú rovnako ako pri každom inom workflowe.