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

سيرورات العمل في ملف واحد

يمكن أن تكون سيرورة العمل مكتفية ذاتيًا بالكامل في ملف PHP واحد. عرّف فئات الخطوات والباني معًا، وضع الملف في مجلد، ثم حمّل ذلك المجلد باستخدام Queuety::load_workflows() كما هو موضح أدناه. لا يفحص Queuety أي مجلد من تلقاء نفسه.

PHP
// workflows/onboard-user.php
use Queuety\Queuety;

class CreateAccount implements \Queuety\Step {
    public function handle(array $state): array {
        $user = create_user($state['email']);
        return ['user_id' => $user->id, 'user_name' => $user->name];
    }
    public function config(): array {
        return ['max_attempts' => 3];
    }
}

class SendWelcome implements \Queuety\Step {
    public function handle(array $state): array {
        wp_mail($state['email'], 'Welcome ' . $state['user_name'], '...');
        return ['welcomed' => true];
    }
    public function config(): array {
        return [];
    }
}

return Queuety::define_workflow('onboard_user')
    ->then(CreateAccount::class, 'create_account')
    ->then(SendWelcome::class, 'send_welcome');

يعيد الملف كائنًا من نوع WorkflowBuilder. تُعرّف كل فئة خطوة داخل الملف. عند تحميل الملف، تصبح الفئات متاحة وتُسجل سيرورة العمل كقالب.

تحميل سيرورات العمل

حمّل جميع ملفات سيرورات العمل من مجلد:

PHP
// Load all .php files from the workflows directory
$count = Queuety::load_workflows(__DIR__ . '/workflows/');

أو حمّل ملفًا واحدًا:

PHP
$template = Queuety::load_workflow_file(__DIR__ . '/workflows/onboard-user.php');

ثم أرسل سيرورة العمل حسب الاسم:

PHP
$workflow_id = Queuety::run_workflow('onboard_user', ['email' => 'user@example.com']);

التحميل التكراري

مرّر true كمعامل ثانٍ لفحص المجلدات الفرعية:

PHP
Queuety::load_workflows(__DIR__ . '/workflows/', recursive: true);

يتيح ذلك تنظيم سيرورات العمل في مجلدات:

الكود
workflows/
├── onboarding/
│   ├── new-user.php
│   └── trial-upgrade.php
├── reports/
│   ├── daily-summary.php
│   └── weekly-digest.php
└── notifications/
    └── digest-email.php

استخدام جميع ميزات سيرورات العمل

تدعم سيرورات العمل في الملفات كل ما يدعمه الباني باستثناء idempotency_key()، إذ لا يُخزن في القالب؛ مرّره لكل عملية إرسال باستخدام Queuety::run_workflow( $name, $payload, [ 'idempotency_key' => '...' ] ). وتعمل ميزات التأخير والإشارات والخطوات المتوازية والتفرع الشرطي وتشغيل سيرورات العمل ومعالجات الإلغاء وتشذيب الحالة جميعها:

PHP
// workflows/approval-flow.php
use Queuety\Queuety;

class SubmitRequest implements \Queuety\Step {
    public function handle(array $state): array {
        return ['submitted_at' => date('Y-m-d H:i:s')];
    }
    public function config(): array { return []; }
}

class ProcessApproval implements \Queuety\Step {
    public function handle(array $state): array {
        return [
            'approved_by' => $state['approved_by'],
            'processed' => true,
        ];
    }
    public function config(): array { return []; }
}

class CleanupRequest implements \Queuety\Handler {
    public function handle(array $payload): void {
        delete_pending_request($payload['request_id']);
    }
    public function config(): array { return []; }
}

return Queuety::define_workflow('approval_flow')
    ->then(SubmitRequest::class)
    ->delay(hours: 24)
    ->wait_for_signal('approved')
    ->then(ProcessApproval::class)
    ->on_cancel(CleanupRequest::class)
    ->prune_state_after(2);

متى تستخدم سيرورات العمل في الملفات

تُعد سيرورات العمل في الملفات مثالية عندما:

  • ينشئ نموذج لغوي كبير أو مولّد أكواد سيرورات العمل برمجيًا
  • تكون سيرورة العمل بسيطة بما يكفي لتناسب ملفًا واحدًا
  • تريد إبقاء منطق الخطوات قريبًا من تعريف سيرورة العمل
  • تنفذ نموذجًا أوليًا وتريد التكرار بسرعة

بالنسبة إلى سيرورات العمل الأكبر ذات فئات الخطوات المشتركة أو البرمجيات الوسيطة المعقدة أو الخطوات المستخدمة في عدة سيرورات عمل، يكون النهج المعتاد المتمثل في استخدام ملفات فئات منفصلة مع التحميل التلقائي PSR-4 أسهل في الصيانة.

طريقة العمل

في الخلفية، تستخدم سيرورات العمل في الملفات المحرك نفسه تمامًا الذي يستخدمه الباني API. كل خطوة مهمة منفصلة في قاعدة البيانات. تنتقل الحالة عبر جدول queuety_workflows. لا توجد إعادة تشغيل، ولا متطلبات للحتمية، ولا فرق في الأداء.

يحمّل كل استدعاء تحميل الملف require (وليس require_once)، لذا حمّل كل ملف مرة واحدة لكل طلب؛ إذ تؤدي إعادة تحميله إلى إعادة تعريف فئاته وفشل العملية. ويُحوّل العنصر المعاد WorkflowBuilder إلى WorkflowTemplate ويُخزن في WorkflowRegistry. لا يختلف الإرسال والتنفيذ عن أي سيرورة عمل أخرى.