Laravel 枚举驱动路由权限
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 类型系统的优点。