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

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

إذا كنت تريد تحديدًا الرجوع إلى خطوة سابقة استنادًا إلى حالة سير العمل، فراجع [التكرار](https://queuety.inline0.dev/ar/docs/workflows/repeats). يتيح ذلك إظهار الحافة الراجعة بوضوح في تعريف سير العمل بدلًا من إخفائها داخل فئة الخطوة.

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

امنح الخطوات أسماء باستخدام الوسيطة الثانية لـ`->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` مع كلا المسارين.
