Arbetsflöden i en enda fil
Ett arbetsflöde kan vara helt fristående i en enda PHP-fil. Definiera stegklasserna och byggaren tillsammans, lägg filen i en katalog och läs in katalogen med Queuety::load_workflows() (visas nedan). Queuety söker inte igenom någon katalog på egen hand.
// 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');
Filen returnerar en WorkflowBuilder. Varje stegklass definieras direkt i filen. När filen läses in blir klasserna tillgängliga och arbetsflödet registreras som en mall.
Läsa in arbetsflöden
Läs in alla arbetsflödesfiler från en katalog:
// Load all .php files from the workflows directory
$count = Queuety::load_workflows(__DIR__ . '/workflows/');
Eller läs in en enskild fil:
$template = Queuety::load_workflow_file(__DIR__ . '/workflows/onboard-user.php');
Skicka sedan arbetsflödet med dess namn:
$workflow_id = Queuety::run_workflow('onboard_user', ['email' => 'user@example.com']);
Rekursiv inläsning
Skicka med true som det andra argumentet för att genomsöka underkataloger:
Queuety::load_workflows(__DIR__ . '/workflows/', recursive: true);
Då kan du organisera arbetsflöden i mappar:
workflows/
├── onboarding/
│ ├── new-user.php
│ └── trial-upgrade.php
├── reports/
│ ├── daily-summary.php
│ └── weekly-digest.php
└── notifications/
└── digest-email.php
Använda alla funktioner för arbetsflöden
Filbaserade arbetsflöden stöder allt som byggaren stöder utom idempotency_key(), som inte lagras i mallen. Skicka i stället med det vid varje utskick med Queuety::run_workflow( $name, $payload, [ 'idempotency_key' => '...' ] ). Fördröjningar, signaler, parallella steg, villkorsstyrd förgrening, körning av arbetsflöden, avbrytningshanterare och gallring av tillstånd fungerar:
// 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);
När du bör använda filbaserade arbetsflöden
Filbaserade arbetsflöden passar bra när:
- En LLM eller kodgenerator skapar arbetsflöden programmatiskt
- Ett arbetsflöde är så enkelt att det ryms i en fil
- Du vill hålla stegens logik nära arbetsflödesdefinitionen
- Du tar fram en prototyp och vill kunna iterera snabbt
För större arbetsflöden med delade stegklasser, komplex middleware eller steg som återanvänds i flera arbetsflöden är standardlösningen med separata klassfiler och PSR-4-autoladdning enklare att underhålla.
Så fungerar det
Under huven använder filflöden exakt samma motor som byggaren API. Varje steg är ett separat jobb i databasen. Tillståndet flödar via tabellen queuety_workflows. Ingen uppspelning, inget krav på determinism och ingen prestandaskillnad.
Varje load-anrop requirear in filen (inte require_once), så läs in varje fil en gång per begäran; om du läser in den två gånger deklareras dess klasser på nytt och det misslyckas. Det returnerade WorkflowBuilder konverteras till en WorkflowTemplate och lagras i WorkflowRegistry. Dispatchexpediering och körning är identiska med alla andra arbetsflöden.