Процеси в одному файлі
Процес може бути повністю самодостатнім в одному файлі PHP. Визначте класи кроків і конструктор разом, помістіть файл у каталог і завантажте цей каталог за допомогою Queuety::load_workflows() (див. нижче). Queuety самостійно не сканує жодного каталогу.
// 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');
Файл повертає WorkflowBuilder. Кожен клас кроку визначено безпосередньо у файлі. Після завантаження файлу класи стають доступними, а процес реєструється як шаблон.
Завантаження процесів
Завантажити всі файли процесів із каталогу:
// Load all .php files from the workflows directory
$count = Queuety::load_workflows(__DIR__ . '/workflows/');
Або завантажити один файл:
$template = Queuety::load_workflow_file(__DIR__ . '/workflows/onboard-user.php');
Потім запустити процес за назвою:
$workflow_id = Queuety::run_workflow('onboard_user', ['email' => 'user@example.com']);
Рекурсивне завантаження
Передайте true другим аргументом, щоб сканувати підкаталоги:
Queuety::load_workflows(__DIR__ . '/workflows/', recursive: true);
Так можна розмістити процеси в каталогах:
workflows/
├── onboarding/
│ ├── new-user.php
│ └── trial-upgrade.php
├── reports/
│ ├── daily-summary.php
│ └── weekly-digest.php
└── notifications/
└── digest-email.php
Використання всіх можливостей процесів
Процеси у файлах підтримують усе, що й конструктор, окрім idempotency_key(), який не зберігається в шаблоні. Передавайте його під час кожного запуску за допомогою Queuety::run_workflow( $name, $payload, [ 'idempotency_key' => '...' ] ). Затримки, сигнали, паралельні кроки, умовне розгалуження, запуски процесів, обробники скасування та скорочення стану — усе це працює:
// 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);
Коли використовувати процеси у файлах
Процеси у файлах ідеально підходять, коли:
- LLM або генератор коду програмно створює процеси
- Процес достатньо простий, щоб уміститися в одному файлі
- Ви хочете зберігати логіку кроків поруч із визначенням процесу
- Ви створюєте прототип і хочете швидко вносити зміни
Для більших процесів зі спільними класами кроків, складним проміжним програмним забезпеченням або кроками, що повторно використовуються в кількох процесах, зручніше підтримувати стандартний підхід із окремими файлами класів і автозавантаженням PSR-4.
Як це працює
Під капотом процеси у файлах використовують той самий рушій, що й конструктор API. Кожен крок — це окреме завдання в базі даних. Стан передається через таблицю queuety_workflows. Відтворення не використовується, вимоги детермінованості немає, різниці у швидкодії також.
Кожен виклик завантаження require файл (а не require_once), тож завантажуйте кожен файл лише раз за запит; повторне завантаження повторно оголошує його класи й завершується помилкою. Повернений WorkflowBuilder перетворюється на WorkflowTemplate і зберігається в WorkflowRegistry. Запуск і виконання не відрізняються від інших процесів.