Tingimuslik hargnemine
Töövood saavad eelmise sammu väljundi alusel jätta vahele soovitud sammu ja jätkata nimega sammust. Selleks tuleb sammu tagastusväärtuses tagastada spetsiaalne võti _next_step.
Kui soovid töövoo oleku põhjal liikuda tagasi varasema sammu juurde, vaata teemat Kordused. Nii jääb tagasisuunaline liikumine töövoo definitsioonis selgelt väljendatuks, mitte ei peideta seda sammu klassi sisse.
Nimega sammud
Määra sammule nimi funktsiooni ->then() teise argumendiga:
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 ] );
Kui nime pole määratud, nimetatakse sammud nende indeksite järgi ('0', '1', '2' jne).
Võti _next_step
Samm võib tagastada võtme _next_step, et liikuda nimega sammu juurde ja jätta vahepealsed sammud vahele. Hüppe sihtmärgile järgnevad sammud käivitatakse endiselt järjekorras: ilma hüppeta jätkab töövoog lihtsalt loendis järgmise sammuga, seega liigub näites edukas samm confirm edasi sammu failure juurde, kui see ei tagasta võtit _next_step, mis selle vahele jätab, või kui HandleFailureHandler ei kontrolli esmalt võtme error olemasolu:
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 [];
}
}
Kui ValidateOrderHandler tagastab väärtuse _next_step => 'failure', jätab töövoog vahele charge, fulfill ja confirm ning liigub otse sammu failure juurde. Võtme _next_step tarbib töövoomootor ja seda ei talletata olekus.
Hargnemismustrid
Jäta tingimuse korral vahele
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 [];
}
}
Varajane lõpetamine
Liigu viimase sammu juurde, et jätta tarbetu töötlemine vahele:
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 [];
}
}
Täielik näide
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 ] );
Kui vahemälu kontroll leiab vaste, liigub töövoog otse check_cache-st done-i, jättes vahele fetch, generate ja save. Kui vastet ei leita, käivitatakse sammud järjekorras ja save jätkub samuti done-sse, seega peab ReturnCachedHandler arvestama mõlema teekonnaga.