Grant: نقشها و دسترسیها در لاراول با PHP enum
خلاصهٔ کاملتر
Grant یه پکیج نقش و دسترسی (roles and permissions) برای لاراوله که Pushpak Chhajed ساخته. فرقش اینه که خود نقشها و دسترسیها تو enumهای PHP تعریف میشن و دیتابیس فقط ذخیره میکنه کدوم کاربر چه نقشی داره. چکها هم از Gate لاراول (یعنی سیستم داخلی مجوزدهی خود فریمورک) رد میشن، پس can()، Gate::authorize() و @can تو Blade بدون تغییر کار میکنن.
enum دسترسی، contract به اسم Ability رو پیاده میکنه و هر مقدارش بهعنوان یه ability تو Gate ثبت میشه. enum نقش هم Role رو پیاده میکنه و لیست دسترسیهایی که میده رو برمیگردونه:
enum Role: string implements RoleContract
{
case Editor = 'editor';
public function permissions(): array
{
return match ($this) {
self::Editor => [Permission::EditPosts],
};
}
}تو Grant نقشها برای «دادن» به کاربرن و دسترسیها برای «چک کردن». یعنی هیچ middleware نقش یا دایرکتیو @role نداره و routeها باید با ابزارهای authorization خود لاراول یه دسترسی رو چک کنن. با اضافه کردن trait HasRoles به مدل User، میتونی با grant()، revoke() و syncRoles() نقشها رو مدیریت کنی. اگه یه مدل Eloquent رو با پارامتر on بدی، نقش فقط روی همون تیم یا پروژه اعمال میشه:
$user->grant(Role::Viewer, on: $team);
$user->can(Permission::ViewReports, $team);موقع چک کردن روی یه مدل خاص، هم نقشهای سراسری کاربر حساب میشن، هم نقشهایی که روی همون مدل گرفته. policyها هنوز برای قوانینی مثل مالکیت پست به درد میخورن. attribute Requires قبل از اجرای متد policy دسترسی رو چک میکنه، پس خود متد فقط باید بررسی کنه پست مال همین کاربره یا نه. میشه یه نقش رو super admin هم کرد، ولی فقط وقتی سراسری داده شده باشه از همه چکهای Gate رد میشه.
Grant به PHP 8.3 به بالا و لاراول ۱۲ یا ۱۳ نیاز داره. دستور grant:install فایل config و migration رو منتشر میکنه و اگه enumهای اولیه نقش و دسترسی وجود نداشته باشن، میسازهشون. یه نکته که مقاله روش تأکید داره: اگه مقدار یه case رو عوض کنی یا حذفش کنی، نقشهای قبلی یتیم میشن و اون کاربرها نقششون رو از دست میدن تا وقتی ردیفها رو دوباره نگاشت کنی. برای این کار grant:sync هست و grant:list و grant:show هم برای دیدن دسترسیها و نقشهای یه کاربر.
نکات کلیدی:
- نقشها و دسترسیها تو enumهای PHP تعریف میشن و دیتابیس فقط انتساب نقش به کاربر رو نگه میداره
- همه چکها از Gate لاراول رد میشن، پس can() و @can بدون تغییر کار میکنن
- middleware نقش یا دایرکتیو @role نداره؛ همیشه دسترسی چک میشه نه نقش
- با پارامتر on میشه نقش رو به یه مدل مثل تیم یا پروژه محدود کرد
- نیازمندیها: PHP 8.3+ و لاراول ۱۲ یا ۱۳
- تغییر یا حذف یه case از enum نقشها رو یتیم میکنه و باید با grant:sync درستش کرد




