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

تشغيل مهام سير العمل

يمكن لسير العمل بدء سير عمل فرعي كإحدى خطواته. يتوقف سير العمل الرئيسي مؤقتًا إلى أن يكتمل سير العمل الفرعي، ثم يدمج الحالة النهائية للفرعي في حالته.

طريقة ->run_workflow()

PHP
use Queuety\Queuety;

$enrichment = Queuety::workflow( 'enrich_user' )
    ->then( FetchSocialHandler::class )
    ->then( FetchCreditScoreHandler::class );

Queuety::workflow( 'onboarding' )
    ->then( CreateAccountHandler::class )
    ->run_workflow( 'enrich_user', $enrichment )
    ->then( SendWelcomeEmailHandler::class )
    ->dispatch( [ 'email' => 'user@example.com' ] );

تأخذ طريقة run_workflow() وسيطين:

  1. اسم لسير العمل الفرعي
  2. مثيل WorkflowBuilder يعرّف خطوات سير العمل الفرعي

طريقة العمل

عندما يصل سير العمل الرئيسي إلى خطوة run_workflow:

  1. يُطلق سير العمل الفرعي كسير عمل مستقل بمعرّف خاص به
  2. يتوقف سير العمل الرئيسي مؤقتًا
  3. ينفذ سير العمل الفرعي خطواته كالمعتاد
  4. عند اكتمال سير العمل الفرعي، تُدمج حالته النهائية في حالة سير العمل الرئيسي
  5. يستأنف سير العمل الرئيسي التنفيذ بالخطوة التالية

حالة سير العمل الرئيسي والفرعي

يتلقى سير العمل الفرعي الحالة المتراكمة الحالية لسير العمل الرئيسي كحمولة أولية. وهذا يعني أن خطوات الفرعي يمكنها الوصول إلى أي بيانات أنتجتها خطوات الرئيسي السابقة:

PHP
class CreateAccountHandler implements Step {
    public function handle( array $state ): array {
        $user_id = wp_create_user( $state['email'], wp_generate_password() );
        return [ 'user_id' => $user_id ];
    }

    public function config(): array {
        return [];
    }
}

// This run-workflow step can access 'user_id' from the parent
class FetchSocialHandler implements Step {
    public function handle( array $state ): array {
        $profile = fetch_social_profile( $state['user_id'] );
        return [ 'social_data' => $profile ];
    }

    public function config(): array {
        return [];
    }
}

دمج الحالة

عند اكتمال سير العمل الفرعي، تُدمج حالته النهائية (باستثناء المفاتيح الداخلية مثل _steps و_queue و_priority و_max_attempts) في حالة سير العمل الرئيسي. وسترى الخطوة التالية في الرئيسي بيانات جميع خطواته السابقة وسير العمل الفرعي:

PHP
class SendWelcomeEmailHandler implements Step {
    public function handle( array $state ): array {
        // Has access to:
        // - $state['email'] (from initial dispatch)
        // - $state['user_id'] (from CreateAccountHandler)
        // - $state['social_data'] (from run-workflow's FetchSocialHandler)
        // - $state['credit_score'] (from run-workflow's FetchCreditScoreHandler)

        send_welcome_email( $state['email'], $state['social_data'] );
        return [ 'welcome_sent' => true ];
    }

    public function config(): array {
        return [];
    }
}

خيارات سير العمل الفرعي

تنطبق خيارات منشئ سير العمل الفرعي on_queue() وwith_priority() وmax_attempts() على سير العمل الفرعي. أما خيارات مستوى سير العمل الأخرى في المنشئ الفرعي، مثل on_cancel() وprune_state_after() وmust_complete_within() وversion() وidempotency_key() وميزانيات max_*() وcompensate_on_failure()، فلا تنتقل إليه:

PHP
$sub = Queuety::workflow( 'heavy_processing' )
    ->on_queue( 'background' )
    ->with_priority( Priority::Normal )
    ->max_attempts( 5 )
    ->then( StepA::class )
    ->then( StepB::class );

Queuety::workflow( 'parent' )
    ->run_workflow( 'heavy', $sub )
    ->then( FinalStep::class )
    ->dispatch( $payload );

مهام سير العمل الفرعية المتداخلة

يمكن أن تحتوي مهام سير العمل الفرعية على مهام أخرى، مما يتيح تداخلًا بأي عمق:

PHP
$inner = Queuety::workflow( 'inner' )
    ->then( InnerStepA::class )
    ->then( InnerStepB::class );

$middle = Queuety::workflow( 'middle' )
    ->then( MiddleStepA::class )
    ->run_workflow( 'inner', $inner )
    ->then( MiddleStepB::class );

Queuety::workflow( 'outer' )
    ->then( OuterStepA::class )
    ->run_workflow( 'middle', $middle )
    ->then( OuterStepB::class )
    ->dispatch( $payload );