Laravel 参数化中间件
Laravel 的中间件系统通过参数传递变得更加强大,它允许基于运行时值的动态行为。此功能对于基于角色的访问控制、速率限制或任何需要可配置中间件逻辑的场景尤其有用。
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class EnsureUserHasRole
{
public function handle(Request $request, Closure $next, string ...$roles)
{
if (!$request->user()?->hasAnyRole($roles)) {
return response()->json([
'error' => 'Insufficient permissions'
], 403);
}
return $next($request);
}
}
让我们探讨一下如何实现基于角色的路由保护:
use App\Http\Controllers\PostController;
use App\Http\Middleware\EnsureUserHasRole;
Route::prefix('posts')->group(function () {
// Public routes
Route::get('/', [PostController::class, 'index']);
// Editor routes
Route::put('/{id}', [PostController::class, 'update'])
->middleware(EnsureUserHasRole::class . ':editor');
Route::post('/', [PostController::class, 'store'])
->middleware(EnsureUserHasRole::class . ':editor');
// Admin routes
Route::delete('/{id}', [PostController::class, 'destroy'])
->middleware(EnsureUserHasRole::class . ':admin');
});
参数化中间件提供了一种干净的方法来实现动态授权规则,同时保持路由和控制器的精简。