Chevere Workflow: موتور مدیریت جریان کار در PHP
خلاصهٔ کاملتر
وقتی اپلیکیشنت نیاز داره یه سری مرحله رو بهترتیب یا بهصورت موازی اجرا کنه، معمولاً یا همهچیز رو توی یه کلاس بزرگ میریم، یا با زنجیرهای از متدها کارها رو مدیریت میکنیم. هر دو روش میتونن خیلی زود به همریختگی تبدیل بشن. Chevere Workflow با یه رویکرد declarative این مشکل رو حل میکنه.
ایده اصلی اینه که تو فقط جابهات رو تعریف میکنی و میگی هر کدوم به خروجی کدوم جاب دیگهای نیاز داره. موتور خودش گراف وابستگی رو میسازه و هر جاب مستقلی رو بهصورت موازی اجرا میکنه، بدون اینکه خودت مجبور باشی orchestration بنویسی.
برای مثال، فرآیند ثبتنام کاربر رو در نظر بگیر: اول باید اکانت ساخته بشه، بعد ایمیل خوشآمدگویی و اطلاعرسانی اسلک میتونن همزمان اجرا بشن چون هر دو فقط به خروجی createAccount وابستهان:
$workflow = workflow(
createAccount: sync(CreateUserAccount::class,
name: variable('name'),
email: variable('email'),
password: variable('password'),
),
sendWelcomeEmail: async(SendWelcomeEmail::class,
userId: response('createAccount', 'id'),
email: response('createAccount', 'email'),
),
notifyTeam: async(NotifySlackChannel::class,
userEmail: response('createAccount', 'email'),
),
);با sync() جاب مسدودکننده (blocking) تعریف میشه و با async() جاب همزمان. variable() یه placeholder برای مقادیریه که موقع اجرا پاس میدی، و response() بهت اجازه میده به خروجی جابهای قبلی دسترسی داشته باشی. میتونی با withRunIf() هم یه جاب رو شرطی کنی تا در صورت لزوم کاملاً skip بشه.
هر جاب میتونه یه closure، یه invocable class یا یه کلاس که از Action ارث میبره باشه. مقدار بازگشتی جاب بهعنوان response ثبت میشه و جابهای پاییندستی میتونن به فیلدهای خاصش ارجاع بدن.
اجرای workflow هم سادهست، فقط متغیرها رو به run() پاس میدی:
$result = run($workflow,
name: 'Jane Doe',
email: 'jane@example.com',
password: 'secret',
enableTrial: true,
);
$userId = $result->response('createAccount')->int('id');مدیریت خطا هم تمیزه. اگه یه جاب exception بنده، موتور اون رو توی WorkflowException میپیچه و دقیقاً بهت میگه کدوم جاب با چه خطایی شکست خورده. برای جابهایی که به سرویسهای خارجی وصل میشن هم میتونی با withRetry() یه retry policy تعریف کنی و تعداد تلاشها و تأخیر بینشون رو مشخص کنی.
پشتیبانی لاراول از طریق پکیج chevere/workflow-laravel ارائه میشه. این پکیج یه کلاس پایه AbstractWorkflow، یه facade و دستورات Artisan اضافه میکنه. با php artisan make:workflow میتونی یه کلاس workflow بسازی، با workflow:list همه workflow های ثبتشده رو ببینی و با workflow:run مستقیماً از ترمینال اجراشون کنی. Service container لاراول هم constructor injection رو بهصورت خودکار مدیریت میکنه.
یه ویژگی جالب دیگه اینه که اگه از VS Code استفاده میکنی، افزونه رسمی پکیج workflow رو بهصورت یه flowchart Mermaid نمایش میده. این دیاگرام مستقیماً از کد تولید میشه، پس همیشه بهروز و دقیقه و نیازی به نگهداری جداگانه نداره.
نکات کلیدی:
- جابهای مستقل بهصورت خودکار و موازی اجرا میشن
- وابستگیها declarative تعریف میشن، نه با glue code دستی
withRunIf()برای اجرای شرطی جابهاwithRetry()برای مدیریت خطا در سرویسهای ناپایدار- پشتیبانی کامل لاراول با facade، Artisan commands و DI خودکار
- افزونه VS Code برای نمایش بصری گراف workflow




