编程

Laravel 枚举驱动路由权限

68 2025-05-15 09:07:00

Laravel 通过向 can() 方法添加直接枚举支持简化了路由中的权限检查。这种增强消除了显式访问枚举值属性的需要,从而产生了更清晰、更具表现力的路由定义。

当构建权限管理至关重要的管理面板或多租户应用,并且希望利用 PHP 的类型安全功能时,此功能尤其突出。

Route::get('/admin', function () {
    // ...
})->can(Permission::ACCESS_ADMIN);

此处是管理面板中如何实现基于角色的路由:

// app/Enums/AdminAccess.php
 
<?php
 
namespace App\Enums;
 
enum AdminAccess: string
{
    case VIEW_REPORTS = 'view_reports';
    case MANAGE_STAFF = 'manage_staff';
    case EDIT_CONFIG = 'edit_config';
}
 
// web.php
Route::prefix('admin')->group(function () {
    Route::get('/reports', ReportController::class)
        ->can(AdminAccess::VIEW_REPORTS);
 
    Route::get('/staff', StaffController::class)
        ->can(AdminAccess::MANAGE_STAFF);
 
    Route::post('/config', ConfigController::class)
        ->can(AdminAccess::EDIT_CONFIG);
});

该路由定义变得更加直观且更具可维护性:

/// Previous approach
->can(AdminAccess::MANAGE_STAFF->value)
// New, cleaner approach
->can(AdminAccess::MANAGE_STAFF)

这个增强的 can() 方法使基于权限的路由更加优雅,同时保持了 PHP 类型系统的优点。