حسین غلامیان
حسین غلامیان
خواندن ۲ دقیقه·۳ سال پیش

Accessors & Mutators & casts در لاراول


در لاراول Accessor ها مقادیر خروجی از دیتابیس را میتوانند تغییر دهند و برعکس Mutators ها مقادیری که میخواهند در دیتا بیس سیو شوند را تغییر میدهند برای درک بهتر به مثال زیر توجه کنید

فرض کنید اسم تمام کاربران شما در دیتا بیس با حرف کوچک ثبت شده باشد برای مثال nima و ali و غیره ولی شما نیاز دارید در تمام view هایتان نام کاربران برا با حرف اول بزرگ نمایش دهید یا اینکه شما لازم دارید که موقع ثبت کردن اسم کاربران در سایت حرف اول همه کوچک یا بزرگ شود این کار در لاراول با استفاده از Accessors و Mutators به راحتی امکان پذیر است

برای پیاده سازی مثال بالا فقط کافی است متدی به شکل camel case در مدل تعریف کرده و همچنین کلاس use Illuminate\Database\Eloquent\Casts\Attribute; را use کنیم سپس متد را به شکل زیر پیاده سازی میکنیم

protected function firstName(): Attribute { return Attribute::make( get: fn ($value) => ucfirst($value), ); }

هم‌اکنون می‌توان بدون تغییر هیچ کدی، از این accessor استفاده کرد. فرض کنید کاربری با شناسه‌ی 3 و نام nimaداریم:

$user = User::find(3); echo $user->first_name; // Nima

توجه شود که نام متد به صورت خودکار از camel case به snake case تبدیل میشود



برای تعریف Mutators فقط کافیست در متد بالا به جای get از set استفاده کنیم

protected function firstName(): Attribute { return Attribute::make( get: fn ($value) => ucfirst($value), set: fn ($value) => strtolower($value), ); }

Casts:

همونطور که میدانید در دیتابیس نمیتوانیم یک ارایه یا ابجکت ذخیره کنیم بلکه باید ان را به Json تبدیل کنیم

فرض کنید یک ارایه از عکس های گالری یک کاربر داریم و برای ذخیره سازی باید هر بار ان را به Json تبدیل کنید و هر زمان که میخواهیم آن را دریافت کنیم باید آن را به یک ارایه تبدیل کنیم برای اینکه از این تبدیلات مککر خلاص شویم casts در لاراول به کمک ما امده است نگران نباشد برای استفاده از cast ها لازم نیست که یک متد جدید بسازید فقط کافیست یک پراپرتی را به شکل زیر در مدل خود تعریف کنید

class User extends Model { protected $casts = [ 'images' => 'array', 'is_premium' => 'boolean', 'userObject' => 'object'; 'birthday' => 'datetime' ]; }

این تبدیلات به صورت خود کار رفت و برگشتی انجام میشود.


منبع :

https://laravel.com/docs/9.x/eloquent-mutators#defining-an-accessor


نویسنده : حسین غلامیان

accessors mutatorscasts لاراوللاراولlaravelAccessors
شاید از این پست‌ها خوشتان بیاید