Ga naar de inhoud

Voorwaardelijke vertakkingen

Workflows kunnen op basis van de uitvoer van een vorige stap overspringen naar een benoemde stap. Dit gebeurt door een speciale sleutel _next_step terug te geven in de retourwaarde van de stap.

Als je specifiek wilt terugspringen naar een eerdere stap op basis van de workflowstatus, zie Herhalingen. Zo blijft de terugverbinding expliciet in de workflowdefinitie in plaats van verborgen in een stapklasse.

Benoemde stappen

Geef stappen een naam met het tweede argument van ->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 ] );

Zonder expliciete naam krijgen stappen hun index als naam ('0', '1', '2', enzovoort).

De sleutel _next_step

Een stap kan _next_step teruggeven om naar een benoemde stap te springen en alles ertussen over te slaan. Stappen na het sprongdoel worden nog steeds in volgorde uitgevoerd: zonder sprong gaat de workflow gewoon verder met de volgende stap in de lijst. In het bovenstaande voorbeeld loopt een geslaagde stap confirm dus door naar failure, tenzij deze een _next_step teruggeeft die deze overslaat, of HandleFailureHandler eerst controleert op een sleutel 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 [];
    }
}

Wanneer ValidateOrderHandler _next_step => 'failure' teruggeeft, slaat de workflow charge, fulfill en confirm over en springt direct naar stap failure. De sleutel _next_step wordt door de workflowengine gebruikt en niet in de status opgeslagen.

Vertakkingspatronen

Overslaan op basis van een voorwaarde

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

Vroegtijdig voltooien

Spring naar de laatste stap om onnodige verwerking over te slaan:

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

Volledig voorbeeld

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

Als de cachecontrole een treffer vindt, springt de workflow rechtstreeks van check_cache naar done, waarbij fetch, generate en save worden overgeslagen. Bij een misser worden de stappen in volgorde uitgevoerd en loopt save ook door naar done. Daarom moet ReturnCachedHandler beide paden aankunnen.