المقدمة #
في تطبيقات الويب الحديثة تحتاج إلى التحكم فيما يستطيع كل مستخدم فعله. يوفر لارافيل نظام بوابات بسيط، لكن لتطبيق أذونات معقدة على أساس الدور تُعد حزمة spatie/laravel-permission الأكثر شهرة.
التثبيت #
composer require spatie/laravel-permission
نشر الإعدادات والهجرات #
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
php artisan migrate
إعداد الأدوار والأذونات #
أضف السمة HasRoles إلى نموذج User الخاص بك:
use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable
{
use HasRoles;
}
إنشاء الأدوار والأذونات، على سبيل المثال في Seeder:
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
Permission::create(['name' => 'edit articles']);
Permission::create(['name' => 'delete articles']);
$admin = Role::create(['name' => 'admin']);
$admin->givePermissionTo(['edit articles', 'delete articles']);
$author = Role::create(['name' => 'author']);
$author->givePermissionTo('edit articles');
إسناد الأدوار للمستخدمين #
$user = User::find(1);
$user->assignRole('admin'); // أو
$user->syncRoles(['author']);
استخدام الـ Middleware #
أضف الـ Middleware إلى app/Http/Kernel.php:
protected $routeMiddleware = [
// …
'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,
];
حماية المسارات:
Route::group(['middleware' => ['role:admin']], function () {
Route::delete('/articles/{id}', 'ArticleController@destroy');
});
Route::get('/articles/{id}/edit', 'ArticleController@edit')
->middleware('permission:edit articles');
فحص الأذونات داخل Blade #
@can('edit articles')
<a href="{{ route('articles.edit', $article) }}">Edit</a>
@endcan
@role('admin')
<button>Delete</button>
@endrole
الاختبار #
public function test_admin_can_delete_article()
{
$admin = User::factory()->create()->assignRole('admin');
$article = Article::factory()->create();
$this->actingAs($admin)
->delete(route('articles.destroy', $article))
->assertRedirect();
}
الخاتمة #
مع حزمة spatie/laravel-permission يمكنك تنفيذ نظام أذونات مستند إلى قاعدة بيانات في دقائق. لا تنسَ تفعيل التخزين المؤقت للأذونات في بيئة الإنتاج لأفضل أداء:
php artisan permission:cache-reset