Saltar al contenido

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():

PHP
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:

PHP
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

PHP
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:

PHP
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

PHP
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.