Ramificação condicional
Os workflows podem saltar para uma etapa nomeada com base na saída de uma etapa anterior. Para isso, retorne uma chave especial _next_step no valor de retorno da etapa.
Se você quiser especificamente voltar a uma etapa anterior com base no estado do workflow, consulte Repetições. Assim, o retorno fica explícito na definição do workflow, em vez de ficar oculto dentro de uma classe de etapa.
Etapas nomeadas
Dê um nome às etapas usando o segundo argumento de ->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 ] );
Sem um nome explícito, as etapas recebem nomes com base no índice ('0', '1', '2', etc.).
A chave _next_step
Uma etapa pode retornar _next_step para saltar para uma etapa nomeada, ignorando tudo o que estiver entre elas. As etapas após o destino do salto continuam sendo executadas em ordem: sem um salto, o workflow simplesmente continua com a próxima etapa da lista. Portanto, no exemplo acima, uma etapa confirm bem-sucedida segue para failure, a menos que retorne um _next_step que a ignore, ou que HandleFailureHandler verifique primeiro se existe uma chave 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 [];
}
}
Quando ValidateOrderHandler retorna _next_step => 'failure', o workflow ignora charge, fulfill e confirm, saltando diretamente para a etapa failure. A chave _next_step é consumida pelo mecanismo do workflow e não é persistida no estado.
Padrões de ramificação
Pular sob uma condição
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 [];
}
}
Conclusão antecipada
Salte para a etapa final para evitar processamento desnecessário:
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 [];
}
}
Exemplo completo
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 ] );
Se a verificação do cache encontrar um resultado, o workflow salta de check_cache diretamente para done, ignorando fetch, generate e save. Se não encontrar, as etapas são executadas em ordem e save também segue para done; por isso, ReturnCachedHandler precisa lidar com os dois caminhos.