应显式指定请求类型调用only(),如request()->only(['id'], 'get')严格从url取值;误用param()->only()会混入路由或post数据导致语义模糊,且无来源参数时行为不可控。

只取 GET 或 POST 中的几个字段,用 only()
最直接的方式是调用 only() 方法,并显式指定请求类型。它不合并、不猜测,只从目标来源(如 $_GET 或 $_POST)里捞出你列的字段,未提交的字段自动忽略,不会补 null 或空字符串。
常见错误是误用 param() + only(),结果混入了路由变量或 POST 数据,导致字段语义模糊。
-
request()->only(['id', 'page'], 'get')→ 只从 URL 查询串中取id和page -
request()->only(['username', 'email'], 'post')→ 只从表单 POST 体中取这两个字段 - 第三个参数可加过滤函数:
request()->only(['name'], 'get', 'htmlspecialchars') - 如果字段不存在,对应键不会出现在返回数组中(不是设为
null)
param() 的 only() 会混数据,慎用
request()->param()->only(...) 或 request()->only(...) 不传第二个参数时,默认走 param() 逻辑,即合并 GET、POST、路由变量。这在 API 场景下容易出错:比如路由定义为 'user/:id',又带查询参数 ?id=999,only(['id']) 返回的到底是路由值还是查询值,取决于框架配置 url_param_type,不可控。
真实场景中,多数接口明确知道参数来源——前端发的是 query 还是 body,没必要让框架猜。
- 想严格按来源取,必须写明第二个参数:
'get'、'post'、'route' -
request()->only(['token'])(无类型)→ 可能从路由、GET、POST 里任意一个先匹配到就返回,顺序不保证 - 调试时可用
dump(request()->param())和dump(request()->get())对比,确认数据源差异
需要过滤+取指定字段,别嵌套调用
有人习惯先 only() 再对每个字段单独 get('field', '', 'trim'),这多此一举。其实 only() 支持第三参数直接批量过滤,底层会统一应用。
- ✅ 正确:
request()->only(['title', 'content'], 'post', 'trim|htmlspecialchars') - ❌ 错误:先
$data = request()->only([...], 'post'),再 foreach 做input()或手动trim - 过滤器之间用竖线
|分隔,支持内置函数(intval、floatval)和闭包,但闭包需注意作用域 - 注意:过滤只作用于实际存在的字段,不存在的字段不会被创建也不会报错
路由参数和查询参数同名时,only('get') 是唯一保险解法
比如访问 /user/123?name=alice,路由规则是 'user/:id'。此时 request()->get('id') 返回 123(路由值),但 request()->get('name') 才是你要的查询值。如果用 param('name'),可能被路由或 POST 干扰。
这时候若只想安全拿到 name 和 sort 这两个纯查询参数,唯一可靠方式就是:
request()->only(['name', 'sort'], 'get')- 避免依赖
param()或省略来源参数 - 上线前检查
config/app.php中的url_param_type,设为0(仅路由)或2(仅参数)可减少歧义,但不能替代显式声明来源
真正麻烦的从来不是语法,而是你以为“框架会懂你想干嘛”——它只按配置和调用方式执行,不多猜,也不纠错。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











