Koşullu Dallanma
İş akışları, önceki bir adımın çıktısına göre adlandırılmış bir adıma atlayabilir. Bunun için adımın dönüş değerinde özel bir _next_step anahtarı döndürülür.
İş akışı durumuna göre özellikle önceki bir adıma geri dönmek istiyorsanız Tekrarlar bölümüne bakın. Böylece geriye dönüş kenarı, bir adım sınıfının içine gizlenmek yerine iş akışı tanımında açıkça belirtilir.
Adlandırılmış adımlar
->then() öğesine ikinci bağımsız değişken olarak bir ad vererek adımları adlandırın:
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 ] );
Açıkça ad verilmezse adımlar dizinlerine göre adlandırılır ('0', '1', '2' vb.).
_next_step anahtarı
Bir adım, aradaki tüm adımları atlayarak adlandırılmış bir adıma geçmek için _next_step döndürebilir. Atlanan hedef adımdan sonraki adımlar sırayla çalışmaya devam eder: atlama yapılmadığında iş akışı listedeki bir sonraki adımla sürer. Bu nedenle yukarıdaki örnekte başarılı bir confirm adımı, atlayan bir _next_step döndürmediği veya HandleFailureHandler önce error anahtarını kontrol etmediği sürece failure içine geçer:
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' döndürdüğünde iş akışı charge, fulfill ve confirm adımlarını atlayıp doğrudan failure adımına geçer. _next_step anahtarı iş akışı motoru tarafından kullanılır ve duruma kaydedilmez.
Dallanma örüntüleri
Koşul sağlandığında atla
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 [];
}
}
Erken tamamlama
Gereksiz işlemleri atlamak için son adıma geçin:
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 [];
}
}
Tam örnek
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 ] );
Önbellek denetimi isabet bulursa iş akışı check_cache adımından doğrudan done adımına geçer ve fetch, generate ile save adımlarını atlar. Önbellek isabeti yoksa adımlar sırayla yürütülür ve save ayrıca done adımına geçer; bu nedenle ReturnCachedHandler her iki yolu da desteklemelidir.