$request->input()最安全:支持默认值(如input('page', 1))、点号取嵌套键(如input('user.name'))、类型方法(如integer('limit')),自动处理空字符串等边界,且不混入文件字段。

直接用 $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)或filter_var(..., FILTER_VALIDATE_BOOLEAN)更可靠,能正确处理"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(cURL 要加-H "Content-Type: application/json",axios 要显式设置headers: {'Content-Type': 'application/json'}) - 请求体必须是合法 JSON 字符串(比如用
JSON.stringify(data)发送),否则$request->json()返回空实例,调用all()得到空数组 - 错误写法:
axios.post('/api/user', {name: 'A'})默认发application/x-www-form-urlencoded,此时该用$request->input('name'),不是$request->json() - 稳妥做法:先判断
$request->isJson(),再决定走哪条路径
最易被忽略的一点:验证后调用 $request->input() 可能拿到修改过的值(比如 validate() 中的 nullable 规则会把空字符串转为 null),而不是原始请求里的原始字符串。需要原始值时,得在 validate() 前取,或者用 $request->getOriginalInput()(Laravel 9.20+)。











