کار با Enum ها در لاراول
وقتی با Enum کار میکنیم، خیلی وقتها لازم میشه که اونها رو بهصورت استاتیک صدا بزنیم. مثلاً وقتی میخواهیم دسترسی به یک متد کنترلر رو با استفاده از نقش کاربر بررسی کنیم:
$this->authorize(Role::MANAGER->name);Code language: PHP (php)
`
این روش کمی دستوپاگیر به نظر میرسه. با یک تابع کوچیک میتونیم این رو سادهتر کنیم:
$this->authorize(Role::MANAGER());Code language: PHP (php)
اینجا ما Enum رو \”قابل فراخوانی\” کردیم. این کار با استفاده از متد جادویی __callStatic() انجام میشه.
نمونهای از یک Enum برای مدیریت هزینهها:
}
}
حالا:
Expenses::CREATE_EXPENSE() // \"CREATE_EXPENSE\"Code language: PHP (php)
⚠️ چرا رشته ساده ننویسیم؟
چون قدرت Enum ها اینه که از خطاهای تایپی جلوگیری میکنن. مثلاًCRAETE_EXPENSEدر Enum خطا میده، ولی به صورت رشته ساده خطایی ایجاد نمیکنه.
پشتیبانی از Backed Enum
این روش هم روی Enum معمولی جواب میده و هم روی Backed Enum.
مثلاً برای ذخیره اعداد در دیتابیس:
enum Expenses: int
{
case CREATE_EXPENSE = 1;
case DELETE_EXPENSE = 2;
case APPROVE_EXPENSE = 3;
}Code language: JavaScript (javascript)
و بعد:
Expenses::CREATE_EXPENSE() // 1Code language: PHP (php)
ساختن Trait برای همه Enum ها
چون این متد عمومی هست، بهتره یک Trait بسازید:
}
}
و در هر Enum استفاده کنید:
',
self::DELETE_EXPENSE => '',
self::APPROVE_EXPENSE => '',
};
}Code language: PHP (php)
یا برای متن توضیحی:
public function longDescription()
{
return match($this) {
self::CREATE_EXPENSE => $this->createDescription(),
self::DELETE_EXPENSE => $this->deleteDescription(),
self::APPROVE_EXPENSE => $this->approveDescription(),
};
}
private function createDescription()
{
return \"کاربری که این دسترسی رو داره، میتونه رکورد هزینه ایجاد کنه تا توسط تیم حسابداری بررسی بشه.\";
}Code language: PHP (php)
در Blade:
{{ Expenses::APPROVE_EXPENSE->longDescription() }}Code language: PHP (php)
یا:
{{ $permission->longDescription() }}Code language: PHP (php)
ℹ️ نکته: برای استفاده مستقیم Enum در Blade، میتونید در ابتدای فایل ایمپورت کنید:
@use('\App\Enums\Expenses')Code language: JavaScript (javascript)
در این مقاله یاد گرفتیم که چطور میشه در لاراول با Enum ها راحتتر کار کرد.
با استفاده از متد جادویی __callStatic() میتونیم Enum ها رو به شکل متد صدا بزنیم (قابل فراخوانی یا Invokable). همچنین یاد گرفتیم چطور با Backed Enum کار کنیم، برای همه Enum ها یک Trait بسازیم و متدهای سفارشی مثل نمایش آیکون یا توضیحات طولانی به هر Enum اضافه کنیم.
این کارها باعث میشه کدمون تمیزتر، قابل خواناتر و ایمنتر باشه.
