编程

Laravel 参数化中间件

158 2025-02-10 17:57:00

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');
});

参数化中间件提供了一种干净的方法来实现动态授权规则,同时保持路由和控制器的精简。