Expressive؛ تبدیل مدلهای Eloquent به آبجکتهای Typed
خلاصهٔ کاملتر
پکیج Expressive ساختهی وندل آدریل، مدلهای Eloquent را به آبجکتهای PHP با تایپ مشخص تبدیل میکنه و هر وقت لازم باشه داده را ذخیره کنی، دوباره اون آبجکتها را به مدل Eloquent برمیگردونه. ایده اینه که بهجای پاسدادن مدلهای کامل Eloquent در سراسر کد، با آبجکتهای سبک و typed کار کنی و منطق دامین را از لایهی دیتابیس جدا نگه داری، بدون اینکه Eloquent را کنار بذاری.
مدلها با افزودن trait به اسم IsExpressive و چند attribute مثل #[Fillable] و #[Hidden] به این سیستم میپیوندن:
#[Fillable(['name', 'email', 'role', 'password'])]
#[Hidden(['password', 'remember_token'])]
class User extends Authenticatable
{
use IsExpressive;
}پکیج یک دستور Artisan هم داره (make:expressive) که از روی یک مدل موجود، کلاس typed را میسازه. کلاس تولیدشده پراپرتیهای public و typed داره که ستونها، رابطهها و accessorها را آینه میکنن؛ attribute مخصوص #[Relationship] پراپرتیهای مربوط به رابطهها و #[Virtual] مقادیر accessor مثل displayName را مشخص میکنه.
برای تبدیل، کافیه روی یک مدل، کالکشن یا query builder متد expressive() را صدا بزنی و در صورت نیاز accessorها یا رابطهها را انتخابی اضافه کنی:
$user = User::findOrFail(1)->expressive(attributes: ['display_name']);
$users = User::query()->get()->expressive(relationships: ['posts']);مسیر برعکس هم پشتیبانی میشه: متد model() یک نمونهی ذخیرهنشدهی Eloquent از آبجکت typed میسازه و save() اون را همراه با رابطههای مستقیم پشتیبانیشده ذخیره میکنه. هر دو روش قواعد mass-assignment لاراول را رعایت میکنن. این پکیج به PHP 8.3 به بالا نیاز داره و از لاراول ۱۲ و ۱۳ پشتیبانی میکنه.
نکات کلیدی:
- Expressive مدل Eloquent را به آبجکت PHP با تایپ مشخص و برعکس تبدیل میکنه
- اشتراک با trait به نام IsExpressive و attributeهایی مثل Fillable و Hidden
- دستور make:expressive کلاس typed را از روی مدل میسازه
- متدهای model() و save() آبجکت typed را به مدل برمیگردونن و ذخیره میکنن




