Умовне розгалуження
Робочі процеси можуть переходити до іменованого кроку залежно від результату попереднього кроку. Для цього потрібно повернути спеціальний ключ _next_step у значенні, яке повертає крок.
Якщо вам потрібно перейти назад до попереднього кроку залежно від стану робочого процесу, див. Повторення. Так зворотний перехід буде явно зазначено у визначенні робочого процесу, а не приховано в класі кроку.
Іменовані кроки
Задайте крокам імена за допомогою другого аргументу ->then():
use Queuety\Queuety;
Queuety::workflow( 'process_order' )
->then( ValidateOrderHandler::class, 'validate' )
->then( ChargePaymentHandler::class, 'charge' )
->then( FulfillOrderHandler::class, 'fulfill' )
->then( SendConfirmationHandler::class, 'confirm' )
->then( HandleFailureHandler::class, 'failure' )
->dispatch( [ 'order_id' => 123 ] );
Якщо ім’я не задано, кроки отримують імена за індексом ('0', '1', '2' тощо).
Ключ _next_step
Крок може повернути _next_step, щоб перейти до іменованого кроку, пропустивши всі проміжні. Кроки після цільового кроку виконуються за порядком: якщо не відбувається переходу, робочий процес просто продовжується наступним кроком у списку. Тож у наведеному вище прикладі успішно виконаний крок confirm переходить далі до failure, якщо не поверне _next_step, що пропускає його, або HandleFailureHandler спершу перевіряє наявність ключа error:
use Queuety\Step;
class ValidateOrderHandler implements Step {
public function handle( array $state ): array {
$order = wc_get_order( $state['order_id'] );
if ( ! $order || $order->get_status() === 'cancelled' ) {
return [
'error' => 'Order is invalid or cancelled',
'_next_step' => 'failure',
];
}
return [
'order_total' => $order->get_total(),
'customer_id' => $order->get_customer_id(),
];
}
public function config(): array {
return [];
}
}
Коли ValidateOrderHandler повертає _next_step => 'failure', робочий процес пропускає charge, fulfill і confirm та переходить безпосередньо до кроку failure. Ключ _next_step обробляється рушієм робочих процесів і не зберігається у стані.
Шаблони розгалуження
Пропуск за умовою
class CheckInventoryHandler implements Step {
public function handle( array $state ): array {
$in_stock = check_inventory( $state['sku'] );
if ( ! $in_stock ) {
return [
'reason' => 'Out of stock',
'_next_step' => 'notify_backorder',
];
}
return [ 'inventory_reserved' => true ];
}
public function config(): array {
return [];
}
}
Дострокове завершення
Перейдіть до останнього кроку, щоб пропустити непотрібну обробку:
class CheckCacheHandler implements Step {
public function handle( array $state ): array {
$cached = get_transient( "report_{$state['user_id']}" );
if ( $cached ) {
return [
'report_url' => $cached,
'_next_step' => 'done',
];
}
return [ 'cache_miss' => true ];
}
public function config(): array {
return [];
}
}
Повний приклад
Queuety::workflow( 'content_pipeline' )
->then( CheckCacheHandler::class, 'check_cache' )
->then( FetchDataHandler::class, 'fetch' )
->then( CallLLMHandler::class, 'generate' )
->then( SaveResultHandler::class, 'save' )
->then( ReturnCachedHandler::class, 'done' )
->dispatch( [ 'user_id' => 42 ] );
Якщо перевірка кешу знаходить дані, робочий процес переходить від check_cache безпосередньо до done, пропускаючи fetch, generate і save. Якщо даних у кеші немає, кроки виконуються за порядком, а save переходить далі до done. Тому ReturnCachedHandler має обробляти обидва сценарії.