متد defaults() در لاراول ۱۴: مقدار پیشفرض مدل با کد
خلاصهٔ کاملتر
تو لاراول تا الان مقدار پیشفرض فیلدهای یه مدل Eloquent رو با پراپرتی $attributes تعیین میکردی. مشکل اینجاست که PHP برای مقدار اولیهی یه پراپرتی فقط عبارت ثابت (constant expression) قبول میکنه. یعنی نمیتونی اونجا config()، now() یا یه feature flag صدا بزنی. به گفتهی Laravel News، لاراول ۱۴ یه متد defaults() اضافه میکنه که همون آرایه رو برمیگردونه، ولی از کدی که موقع ساخته شدن مدل اجرا میشه.
مثال مقاله یه مدل اشتراکه که دورهی آزمایشی ۱۴ روزه داره و اگه فلگ extended-trials روشن باشه ۳۰ روز. قبلاً باید این شرط رو توی constructor مینوشتی و parent::__construct رو هم دستی صدا میزدی. حالا کل منطق میره توی defaults():
protected function defaults(): array
{
return [
'cancelled' => false,
'trial_days' => Feature::active('extended-trials') ? 30 : 14,
'expires_at' => now()->addDays(config('billing.grace_period'))->toDateTimeString(),
];
}ترتیب اولویت اینطوریه: اول مقادیر $attributes ست میشن، بعد defaults() روشون merge میشه و اگه کلید مشترک باشه برندهست. آخر سر هم مقادیری که به new، create() یا fill() میدی اعمال میشن و از هر دو جلوترن. مثلاً Subscription::create(['trial_days' => 60]) مقدار ۶۰ میگیره. این پیشفرضها قبل از sync شدن original attributes اضافه میشن، یعنی جزو تغییرات dirty حساب نمیشن ولی موقع insert توی دیتابیس ذخیره میشن.
یه نکتهی مهم: مثل $attributes، خروجی defaults() خامه و از cast یا mutator رد نمیشه. پس باید مقدار رو همونطوری برگردونی که توی دیتابیس ذخیره میشه. مثلاً برای ستونی که cast از نوع array یا json داره باید رشتهی JSON بدی (با json_encode)، وگرنه موقع خوندن خطا میگیری. این متد هم هر بار که یه instance ساخته میشه اجرا میشه، حتی برای ردیفهایی که از دیتابیس لود میشن؛ فقط بعدش مقادیر واقعی ردیف جاشو میگیرن.
دلیل اینکه این تغییر برای لاراول ۱۴ گذاشته شده اینه که ممکنه بعضی مدلها از قبل متدی به اسم defaults() داشته باشن و حالا constructor خروجیش رو قاطی attributeها میکنه. نویسنده پیشنهاد میکنه قبل از آپگرید مدلهاتو برای همچین متدی جستجو کنی و اگه کار دیگهای میکنه اسمشو عوض کنی. این قابلیت رو Jack Bayliss توی PR شمارهی 61688 اضافه کرده و فعلاً توی شاخهی master هست، پس ممکنه تا انتشار نهایی تغییر کنه.
نکات کلیدی:
- متد defaults() تو لاراول ۱۴ اضافه میشه و جایگزین منعطف پراپرتی $attributes هست.
- توش میشه از config()، now() و Feature::active() استفاده کرد که توی پراپرتی ممکن نیست.
- ترتیب اولویت: $attributes بعد defaults() بعد مقادیر create() / fill().
- مقادیر خام هستن و از cast رد نمیشن؛ برای ستون json باید رشتهی JSON برگردونی.
- مدلهایی که از قبل متد defaults() دارن موقع آپگرید باید بررسی بشن.
- این تغییر مشابه انتقال $casts به متد casts() تو لاراول ۱۱ هست.




