Cadence: زمانبندی مبتنی بر مدل در لاراول
خلاصهٔ کاملتر
پکیج Cadence از Steve Bauman یه ایده ساده ولی قدرتمند داره: به جای اینکه همه تسکهای زمانبندیشده رو توی یه فایل مرکزی بریزی، میتونی schedule رو مستقیم به instanceهای مختلف مدل Eloquent وصل کنی. این یعنی هر رکورد در دیتابیس میتونه برنامه زمانی مستقل خودش رو داشته باشه.
بعد از نصب، یه جدول schedules در دیتابیس ساخته میشه که یه ارجاع polymorphic به هر مدل نگه میداره، کنارش expression زمانی، timezone اختیاری، و timestampهای next_run_at و last_run_at هم ذخیره میشن. برای فعالسازی روی هر مدل، کافیه interface و trait مربوطه رو اضافه کنی:
use DirectoryTree\Cadence\HasSchedules;
use DirectoryTree\Cadence\Schedulable;
class Subscription extends Model implements Schedulable
{
use HasSchedules;
}Cadence از دو نوع driver پشتیبانی میکنه: cron expression برای موارد ساده، و RRULE برای تکرارهای پیچیدهتر که توی cron به سختی بیان میشن — مثلاً «هر دو هفته یهبار، سهشنبه و پنجشنبه». هر schedule میتونه timezone مخصوص خودش رو هم داشته باشه، که برای اپلیکیشنهای چندمنطقهای خیلی به درد میخوره.
// صدور فاکتور هر ماه اول ماه، نیمهشب
$subscription->addSchedule(new CronSchedule('0 0 1 * *'));
// هر دو هفته، سهشنبه و پنجشنبه
$subscription->addSchedule(new RruleSchedule('FREQ=WEEKLY;INTERVAL=2;BYDAY=TU,TH'));برای اجرا، Cadence یه دستور Artisan به اسم schedules:run داره که باید هر دقیقه اجرا بشه. این دستور رکوردهایی که next_run_atشون گذشته رو پیدا میکنه، برای هر کدوم یه رویداد ScheduleTriggered فایر میکنه، و بعد زمان اجرای بعدی رو بهروز میکنه. منطق اصلی اپلیکیشن توی listenerها قرار میگیره که به این رویداد واکنش نشون میدن.
این معماری event-driven یعنی زمانبندی از منطق تجاری جدا میمونه و هر مدل schedule مستقل خودش رو مدیریت میکنه — که برای سناریوهایی مثل اشتراکهای چندکاربره یا وظایف وابسته به داده، خیلی طبیعیتر از یه scheduler مرکزیه.
نکات کلیدی:
- به جای فایل scheduler مرکزی، schedule مستقیم به instance مدل Eloquent وصل میشه
- از cron expression و RRULE هر دو پشتیبانی میکنه
- هر schedule میتونه timezone مستقل داشته باشه
- وقتی موعد رسید، رویداد
ScheduleTriggeredفایر میشه و listener واکنش نشون میده - جدول
schedulesدر دیتابیس، زمانبندیها رو باnext_run_atوlast_run_atردیابی میکنه




