最安全的是$request->input(),它支持默认值(如input('page', 1))、点号取嵌套键(如input('user.name'))、类型方法(如integer('limit')),自动过滤文件字段且不混入$_get/$_post,而request()辅助函数在非http上下文可能返回残留数据或空值。

直接用 $request->input() 最安全,别碰 $_GET 或 $_POST——Laravel 的 Request 对象已经做了过滤、类型转换和 CSRF 防御,绕过去等于手动拆掉安全护栏。
怎么取单个参数(带默认值和类型转换)
你不是“拿值”,而是“拿一个可信的、带兜底的值”。$request->input() 就是干这个的:
-
$request->input('page', 1):没传page就自动用1,比三元判断更简洁 -
$request->input('user.name'):能安全取['user' => ['name' => 'foo']],不会因键缺失报错 -
$request->integer('limit')或$request->boolean('active'):比手动(int)更可靠,能正确处理"false"、空字符串等边界情况
注意:$request->input('id') 返回的是字符串,哪怕 URL 是 ?id=123——这是设计行为,不是 bug。
什么时候必须用 $request 对象,不能用 request() 辅助函数
控制器方法里类型提示 Request $request,是唯一能保证请求数据完整性和生命周期可控的方式:
- 在 service 类、job 类、artisan 命令或 Swoole 环境里调用
request()->input(),可能拿到空值、上一个请求残留的数据,甚至直接抛出Target [Illuminate\Http\Request] is not instantiable -
request()是全局辅助函数,本质是服务容器里取实例,但它的绑定依赖当前 HTTP 请求生命周期
正确姿势:控制器里写 public function store(Request $request),然后把 $request 显式传给其他类;不要在其他地方反向去“找” request。
数组参数和文件上传怎么一起处理
前端传 form-data 带数组字段(如 tags[])和文件(avatar)时,别用 all() 一股脑取——它会把文件对象也塞进数组,后续调用 ->store() 会失败:
- 取普通参数用
$request->input('tags', []),它自动过滤掉文件字段 - 取文件单独用
$request->file('avatar')或$request->hasFile('avatar') - 如果硬要用
all(),记得先except('avatar'),但更推荐分治:$data = $request->only(['title', 'content', 'tags'])
注意:$request->all() 在表单有同名字段(如 name 和 name[])时行为不确定,Laravel 7+ 会覆盖,别依赖它。
JSON 请求怎么取参数(Content-Type 错了就全白搭)
$request->json()->all() 不是万能钥匙,它只在满足两个前提时才有效:
- 请求头必须带
Content-Type: application/json - 请求体必须是合法 JSON 字符串(不能是空、
null、或含 BOM)
否则 $request->json() 返回空实例,->all() 得到空数组。调试时可加 dd($request->header('Content-Type'), $request->getContent()) 快速验证原始输入。
加密请求体要走中间件解密,且必须清空 $request->json 缓存;all() 在混合表单场景下行为不可控;最常被忽略的,其实是 request() 在非 HTTP 上下文里的失效风险——它不报错,只静默返回错误数据。











