Laravel 10.x 中间件传参核心是路由定义时用“中间件名:参数”语法,参数以字符串形式按序传入 handle() 方法;单参数直接声明变量,多参数依次声明,可变参数用 ...$params 接收;路由动态参数需通过 $request->route()?->parameter() 获取,构造函数中不可用;闭包方式可手动注入构造参数。

在 Laravel 10.x 中给中间件传递参数,核心方式是通过路由定义时在中间件名后加冒号和参数,Laravel 会自动把参数作为字符串传入中间件的 handle() 方法。参数不是对象或数组,而是原始字符串,多个用英文逗号分隔,且全部以字符串形式接收。
路由中声明参数(最常用)
在 routes/web.php 或 routes/api.php 中直接写:
-
->middleware('role:admin')→ 传一个字符串'admin' -
->middleware('permission:edit,posts')→ 传两个字符串:'edit'和'posts' -
->middleware('throttle:60,1')→ 常见于内置中间件,同样按顺序接收
中间件中接收参数(注意签名)
在 app/Http/Middleware/YourMiddleware.php 的 handle() 方法里,把参数加在 $next 后面,按顺序声明:
- 单参数:用具体变量名,如
public function handle(Request $request, Closure $next, string $role) - 多参数:依次声明,如
public function handle(Request $request, Closure $next, string $action, string $resource) - 不确定数量:用可变参数语法
...$params,再转为数组处理,例如:public function handle(Request $request, Closure $next, ...$roles)
此时$roles是字符串数组,如['admin', 'editor']
获取路由参数(不是中间件参数)
如果需要的是当前 URL 中的动态路由变量(比如 /user/{id} 中的 id),不能靠中间件参数机制,而要在 handle() 里用:
-
$request->route()?->parameter('id')(PHP 8.0+ 推荐,空安全) -
$request->route()->parameter('id')(需确保路由已解析且参数存在) - 构造函数里绝对拿不到路由参数——Laravel 实例化中间件时路由还没解析
闭包中间件传参(适合临时定制)
在路由定义中直接写闭包,用 app() 手动解析并传构造参数:
->middleware(function ($request, $next) { return app(CheckRole::class, ['role' => 'super_admin'])->handle($request, $next); })- 要求中间件类构造函数明确声明参数,如
public function __construct(private string $role) {} - 这种方式绕过 Laravel 默认注册流程,适合单点强配置,不适用于全局复用


















