优先用$request->input()安全取值,支持默认值和点语法嵌套;明确来源时用$query()、$post()或$json()->all();数组参数需加[]后缀;JSON请求须确保Content-Type正确并显式判断isJson()。

在 Laravel 中获取请求参数,核心原则是:优先用 $request->input() 或 $request->get(),而非直接操作 $_GET 或 $_POST;对表单提交、JSON API、URL 查询都适用,但行为有差异,稍不注意就会拿错值或触发异常。
用 $request->input() 安全取值,支持默认值和点语法嵌套
这是最常用也最推荐的方式,自动合并 query、post、json 数据,且不会因键不存在而报错。
-
$request->input('name')返回字符串值,若不存在则返回null -
$request->input('name', 'default')可设默认值,比三元判断更简洁 -
$request->input('user.name')支持点号访问嵌套数组(如 JSON 中的{"user": {"name": "Alice"}}) - 对布尔型参数(如
?active=0),input()仍返回字符串"0",需手动用filter_var($val, FILTER_VALIDATE_BOOLEAN)
区分 $request->query()、$request->post() 和 $request->all()
当需要明确来源或避免意外覆盖时,应按数据类型选方法,而不是一股脑用 all()。
-
$request->query('page')只从 URL 查询参数(GET)中取值,?page=2→2 -
$request->post('token')只从表单 POST 数据中取,忽略 query 和 JSON -
$request->all()合并所有输入,但会包含_token、_method等 Laravel 自动注入字段,敏感接口慎用 - 若请求是
application/json,$request->post()返回空数组,必须用$request->input()或$request->json()->all()
处理数组参数(如复选框、多文件上传)要加 [] 后缀校验
Laravel 不会自动将同名多个参数转为数组,前端命名和后端取法必须匹配,否则只拿到最后一个值。
- HTML 表单中复选框应写成:
,而不是name="hobbies" - 后端用
$request->input('hobbies')才能得到数组['reading', 'coding'] - 若漏了
[],即使勾选多个,$request->input('hobbies')也只返回最后一个值 - 验证时用
'hobbies.*' => 'string'对每个元素单独校验
JSON 请求体里取值容易忽略 $request->json()->all() 的前提条件
Content-Type 必须是 application/json,且请求体是合法 JSON,否则 $request->json() 返回空实例,调用 all() 得到空数组。
- cURL 示例必须带 header:
-H "Content-Type: application/json" - 前端 fetch 要设置:
headers: {'Content-Type': 'application/json'},且用JSON.stringify(data)发送 - 错误写法:
axios.post('/api/user', {name: 'A'})默认发application/x-www-form-urlencoded,此时要用$request->input('name'),不是$request->json() - 调试技巧:用
dd($request->header('content-type'), $request->json()->all())确认实际解析结果
if ($request->isJson()) {
$data = $request->json()->all();
} else {
$data = $request->all();
}
真正容易出问题的是混合场景:比如一个接口既接受表单提交又接受 JSON,但开发者没检查 isJson() 就直接调 json()->all(),结果在表单请求下静默失败。这种边界情况,必须显式判断内容类型再分支处理。










