Ramificación condicional
Los flujos de trabajo pueden saltar a un paso con nombre según la salida de un paso anterior. Para ello, se devuelve una clave especial _next_step en el valor de retorno del paso.
Si quiere volver a un paso anterior según el estado del flujo de trabajo, consulte Repeticiones. Así, el salto hacia atrás queda explícito en la definición del flujo de trabajo en lugar de ocultarse dentro de una clase de paso.
Pasos con nombre
Asigne un nombre a los pasos usando el 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 ] );
Si no se especifica un nombre, los pasos se nombran según su índice ('0', '1', '2', etc.).
La clave _next_step
Un paso puede devolver _next_step para saltar a un paso con nombre y omitir todo lo que haya entre ambos. Los pasos que siguen al destino del salto se ejecutan en orden: si no hay un salto, el flujo de trabajo simplemente continúa con el siguiente paso de la lista. Por tanto, en el ejemplo anterior, un paso confirm completado correctamente continúa con failure, a menos que devuelva un _next_step que lo omita o que HandleFailureHandler compruebe primero si existe una clave 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 [];
}
}
Cuando ValidateOrderHandler devuelve _next_step => 'failure', el flujo de trabajo omite charge, fulfill y confirm, y salta directamente al paso failure. El motor del flujo de trabajo consume la clave _next_step, que no se conserva en el estado.
Patrones de ramificación
Omitir según una condición
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 [];
}
}
Finalización anticipada
Salte al paso final para omitir el procesamiento innecesario:
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 [];
}
}
Ejemplo 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 ] );
Si la comprobación de caché encuentra una coincidencia, el flujo de trabajo salta de check_cache directamente a done y omite fetch, generate y save. Si no encuentra ninguna, los pasos se ejecutan en orden y save también pasa a done, por lo que ReturnCachedHandler debe gestionar ambas rutas.