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