Ehdollinen haarautuminen
Työnkuluissa voi siirtyä nimettyyn vaiheeseen aiemman vaiheen tulosteen perusteella. Tämä tehdään palauttamalla vaiheen paluuarvossa erityinen _next_step-avain.
Jos haluat siirtyä takaisin aiempaan vaiheeseen nimenomaan työnkulun tilan perusteella, katso Toistot. Näin paluukaari näkyy selvästi työnkulun määritelmässä sen sijaan, että se olisi piilotettu vaiheluokkaan.
Nimetyt vaiheet
Anna vaiheille nimi käyttämällä argumenttina ->then()-toiminnon toista parametria:
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 ] );
Jos nimeä ei anneta, vaiheet nimetään indeksin mukaan ('0', '1', '2' jne.).
_next_step-avain
Vaihe voi palauttaa arvon _next_step, joka siirtää suorituksen nimettyyn vaiheeseen ja ohittaa kaikki väliin jäävät vaiheet. Kohdevaiheen jälkeiset vaiheet suoritetaan edelleen järjestyksessä: ilman siirtymää työnkulku jatkuu luettelon seuraavaan vaiheeseen. Siksi yllä olevassa esimerkissä onnistunut confirm-vaihe siirtyy seuraavaksi vaiheeseen failure, ellei se palauta arvoa _next_step, joka ohittaa sen, tai ellei HandleFailureHandler tarkista ensin error-avainta:
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 [];
}
}
Kun ValidateOrderHandler palauttaa arvon _next_step => 'failure', työnkulku ohittaa vaiheet charge, fulfill ja confirm ja siirtyy suoraan vaiheeseen failure. Työnkulkumoottori kuluttaa _next_step-avaimen, eikä sitä tallenneta tilaan.
Haarautumismallit
Ohitus ehdon perusteella
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 [];
}
}
Varhainen valmistuminen
Siirry viimeiseen vaiheeseen ja ohita tarpeeton käsittely:
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äydellinen esimerkki
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 ] );
Jos välimuistitarkistus löytää osuman, työnkulku siirtyy suoraan vaiheesta check_cache vaiheeseen done ja ohittaa vaiheet fetch, generate ja save. Jos osumaa ei löydy, vaiheet suoritetaan järjestyksessä ja save siirtyy seuraavaksi vaiheeseen done, joten ReturnCachedHandler-vaiheen on toimittava molemmilla poluilla.