انتقل إلى المحتوى

التفرع الشرطي

يمكن لعمليات سير العمل الانتقال إلى خطوة مسماة استنادًا إلى مخرجات خطوة سابقة. ويتم ذلك بإرجاع مفتاح _next_step خاص ضمن القيمة المعادة من الخطوة.

إذا كنت تريد تحديدًا الرجوع إلى خطوة سابقة استنادًا إلى حالة سير العمل، فراجع التكرار. يتيح ذلك إظهار الحافة الراجعة بوضوح في تعريف سير العمل بدلًا من إخفائها داخل فئة الخطوة.

الخطوات المسماة

امنح الخطوات أسماء باستخدام الوسيطة الثانية لـ->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 ] );

تُسمى الخطوات بالفهرس افتراضيًا إذا لم تحدد اسمًا، مثل '0' و'1' و'2' وما إلى ذلك.

المفتاح _next_step

يمكن للخطوة إرجاع _next_step للانتقال إلى خطوة مسماة وتخطي كل ما بينهما. وتستمر الخطوات التالية للهدف بالترتيب: من دون انتقال، يواصل سير العمل ببساطة إلى الخطوة التالية في القائمة؛ لذا في المثال أعلاه، تنتقل خطوة confirm الناجحة إلى failure ما لم تُرجع _next_step لتخطيها أو تتحقق HandleFailureHandler أولًا من وجود مفتاح 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 [];
    }
}

عندما تُرجع ValidateOrderHandler القيمة _next_step => 'failure'، يتخطى سير العمل charge وfulfill وconfirm، وينتقل مباشرةً إلى الخطوة failure. يستهلك محرك سير العمل المفتاح _next_step ولا يحفظه في الحالة.

أنماط التفرع

التخطي عند تحقق شرط

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

الإكمال المبكر

انتقل إلى الخطوة الأخيرة لتخطي المعالجة غير الضرورية:

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

مثال كامل

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

إذا عثر فحص ذاكرة التخزين المؤقت على نتيجة، ينتقل سير العمل من check_cache مباشرةً إلى done، متخطيًا fetch وgenerate وsave. أما عند عدم العثور عليها، فتُنفّذ الخطوات بالترتيب، وتنتقل save أيضًا إلى done؛ لذا يجب أن تتعامل ReturnCachedHandler مع كلا المسارين.