Laravel中间件中无法安全获取路由参数,因路由参数在中间件执行时尚未解析;应改用控制器中$request->route('id')或确保中间件注册在SubstituteBindings之后。

Query 参数是 URL 里的 ? 后面那部分
比如 GET /users?status=active&limit=10,status 和 limit 就是 query 参数。Laravel 里统一用 $request->query('status') 或更通用的 $request->input('status') 获取。它们不依赖请求方法,POST 请求也能带 query 参数(如 POST /users?source=admin),但语义上它表达的是“筛选条件”或“分页控制”,不是主体数据。
Form 参数来自请求体,content-type 决定怎么解析
常见两种形式:
-
application/x-www-form-urlencoded:浏览器表单默认格式,参数像name=John&email=john%40ex.com,Laravel 自动解到$request->input()里 -
multipart/form-data:含文件上传时必须用,$request->file()读文件,$request->input()读普通字段
注意:application/json 不算 form 参数——它走的是 Request Payload,得用 $request->json()->all() 或 $request->get('key')(后者会自动 fallback 到 json/body/input)。
中间件里拿不到路由参数?别急着查 $request->route()->parameters()
这是高频误操作。Laravel 的路由参数(如 /posts/{id} 中的 id)在中间件执行时可能还没被解析出来,尤其是你注册了全局中间件(比如在 app/Http/Kernel.php 的 $middleware 数组里)。真正安全获取的时机是:
- 在控制器方法里直接用
$request->route('id')(推荐) - 或确保中间件注册在
$middlewareGroups['web']里,且排在\Illuminate\Routing\Middleware\SubstituteBindings::class之后 - 绝对不要在中间件里调
$request->route()->parameters()然后判空就报错——$request->route()本身都可能是null
混淆 query 和 form 参数会导致接口行为异常
比如前端用 axios 发 POST,但没设 Content-Type,后端却按 application/json 解析,结果 $request->input('foo') 拿不到值,而 $request->json('foo') 也为空。真实问题是:没对齐 content-type 和数据格式。
验证技巧:
- 打印
$request->headers->get('content-type')看实际类型 - 用
$request->all()查看 Laravel 最终合并后的全部输入(query + form + json) - 避免在验证规则里混用
required_if:other,value这类依赖关系时,把 query 和 body 字段当成同一来源处理——它们生命周期不同,校验顺序也可能受影响
最常被忽略的一点:Laravel 的 $request->input() 是聚合读取,但它的 fallback 顺序(query → request body → json)在某些自定义中间件或 Form Request 场景下会被干扰,这时候显式用 $request->query() 或 $request->post() 反而更可控。


















