Към съдържанието

Условно разклоняване

Работните потоци могат да прескочат към именувана стъпка въз основа на резултата от предишна стъпка. За целта върнатата стойност на стъпката трябва да съдържа специален ключ _next_step.

Ако искате конкретно да се върнете към по-ранна стъпка въз основа на състоянието на работния поток, вижте Повторения. Така връзката назад остава изрично описана в дефиницията на работния поток, вместо да е скрита в клас на стъпка.

Именувани стъпки

Задайте име на стъпките чрез втория аргумент на ->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 ] );

Без изрично зададено име стъпките се именуват с индекса си ('0', '1', '2' и т.н.).

Ключът _next_step

Стъпка може да върне _next_step, за да премине към именувана стъпка и да прескочи всичко между тях. Стъпките след целевата стъпка продължават да се изпълняват по ред: без прескачане работният поток просто продължава със следващата стъпка в списъка, така че в примера по-горе успешна стъпка confirm преминава към failure, освен ако не върне _next_step, което я прескача, или HandleFailureHandler не провери първо за ключ 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 [];
    }
}

Когато ValidateOrderHandler върне _next_step => 'failure', работният поток прескача charge, fulfill и confirm и преминава директно към стъпката failure. Ключът _next_step се използва от механизма на работния поток и не се запазва в състоянието.

Модели за разклоняване

Прескачане при условие

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 [];
    }
}

Ранно приключване

Преминете към последната стъпка, за да прескочите ненужната обработка:

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 [];
    }
}

Пълен пример

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 ] );

Ако проверката на кеша открие съвпадение, работният поток преминава от check_cache директно към done, като прескача fetch, generate и save. При липса на съвпадение стъпките се изпълняват по ред, а save преминава и към done, така че ReturnCachedHandler трябва да обработва и двата пътя.