Aegis: ساختن Value Objectها در لاراول بدون کد تکراری
خلاصهٔ کاملتر
Value Object یه الگوی طراحی (برگرفته از Domain-Driven Design) ه که بهت میگه به جای پاس دادن یه رشتهی خام مثل "user@example.com" دور و برِ اپ، یه شیء بساز که از لحظهی ساخته شدن، معتبر بودنش تضمین شده. سازندهی اون کلاس یا یه نمونهی درست برمیگردونه، یا exception میندازه. مشکل اینه که نوشتن یه Value Object درستوحسابی حدود ۷۰ خط PHP میخواد: کلاس final readonly، validation در constructor، normalization، متد equals()، و بلوک Castable برای Eloquent. این تکرار باعث میشه خیلیها اصلاً سراغش نرن.
Aegis اون ۷۰ خط رو برات مینویسه. با یه دستور Artisan مثل:
php artisan make:value-object Email \
--rule=email \
--normalize=lower \
--cast=Order.emailسه چیز تولید میشه: کلاس Value Object با validation و normalization کامل، یه test stub (Pest یا PHPUnit بسته به اینکه کدوم در پروژهات هست)، و خودِ Aegis مدل Order.php رو هم پَچ میکنه و email => Email::class رو به casts() اضافه میکنه.
یه ویژگی مهم دیگه اینه که validation در FormRequest هم از همون Value Object استفاده میکنه، نه یه قانون جداگانه. Aegis یه macro به نام valueObject روی Rule لاراول ثبت میکنه:
return [
'email' => ['required', Rule::valueObject(Email::class)],
];بعد از validate شدن، با اضافه کردن trait مربوطه به FormRequest، میتونی مستقیم نمونهی Value Object رو بگیری: $request->valueObject('email'). دیگه نیازی نیست دو جا قوانین validation رو نگه داری.
برای پروژههای موجود هم دستور php artisan vo:scan هست که مدلها و migration ها رو اسکن میکنه، ستونهایی که کاندید Value Object هستن رو پیدا میکنه (email، uuid، country_code، slug و...) و دقیقاً دستور آمادهای که باید اجرا کنی رو چاپ میکنه. یه عدد «coverage» هم نشون میده چند درصد از ستونها با Value Object پوشش داده شدن.
نکات کلیدی:
- Value Object دادهی خام رو در نقطهی ورود اعتبارسنجی میکنه و باگهای ناشی از primitive های نامعتبر رو حذف میکنه
- یه دستور Artisan کلاس کامل با Eloquent cast و test stub تولید میکنه
- validation در FormRequest از همون کلاس استفاده میکنه؛ قانون تکراری نداری
- vo:scan برای پروژههای موجود پیشنهاد میده کجا Value Object اضافه کنی
- نیاز به PHP 8.3+ و Laravel 13 داره




