输入变量 vs 路由参数绑定

ThinkPHP 8 · 数据入口

输入变量 vs 路由参数绑定

都从 URL 获取数据,但一个是主动捞取,一个是自动注入。理解区别,掌握使用时机,写出更优雅的控制器。

输入变量:自己动手“捞”数据

在控制器内部通过 input()request()->param() 主动获取请求参数。可获取 URL 查询参数、POST 表单、JSON 等。

// 控制器 public function info() { $id = input('id'); $user = UserModel::find($id); }

特点:灵活,想拿什么就拿,但控制器与请求细节耦合。

路由参数绑定:框架自动“递”过来

路由占位符与控制器方法参数同名时,自动注入。无需手动获取。

// 路由 Route::get('user/:id', 'User/info'); // 控制器 public function info($id) { $user = UserModel::find($id); }

特点:声明式,方法签名即文档,支持类型约束,与请求解耦。

核心区别一览

对比维度输入变量路由参数绑定
获取方式主动调用 input()框架自动注入
命名约束必须与路由占位符同名
类型处理手动校验转换自动类型约束
耦合度与 Request 耦合只依赖参数
适用数据查询参数、POST、JSONURL 路径片段

虽然数据都来自 HTTP 请求,但“谁负责把数据交给控制器”完全不同:一个是自己去取,一个是人家送到手上。

什么时候用哪个?记住这条原则

定位“哪一个”资源 → 用参数绑定
描述“怎么操作” → 用输入变量

决策流程:

  • ① 参数用于标识资源本身?/user/5 中的 5 → 必选项 → 写在 URL 路径中,用参数绑定
  • ② 参数是可选的筛选、分页、排序??page=2&keyword=手机 → 可选项 → 用 input() 获取

判断口诀:删掉这个参数,如果 URL 就找不到那个东西了,就用参数绑定;如果还能访问只是结果变了,就用输入变量。

典型场景示例

1. 纯参数绑定(资源定位)

// 获取用户详情 Route::get('user/:id', 'User/info'); public function info(int $id) { ... }

2. 纯输入变量(可选参数)

// 文章列表,分页和搜索 Route::get('articles', 'Article/index'); public function index() { $keyword = input('keyword', ''); $page = input('page', 1); }

3. 混合使用(最常见)

// 某分类下的商品,分页、排序 Route::get('category/:id/products', 'Product/listByCategory'); public function listByCategory(int $id) { $page = input('page', 1); $sort = input('sort', 'price'); // $id 定位分类,其余描述操作 }

访问示例:/category/3/products?page=2&sort=price&order=desc

🧠

RESTful 哲学:路径说“对谁”,查询说“如何”

  • 路径(Path):标识资源,是必选项 → 参数绑定
  • 查询参数(Query):修饰操作,是可选项 → 输入变量

遵循这一原则设计的 API,URL 自身就清晰表达了意图,可读性极强。

资源定位用参数绑定,自动注入,清晰稳定;
操作选项用输入变量,灵活获取,按需组合。
记住这一条,你就掌握了控制器参数设计的最佳实践

本站所有文章、数据、图片来源于网络,仅供学习使用,如有侵权,联系删除!

推荐资讯

热门标签

广告
YznCMS后台开发框架
后台框架永久免费且商业授权无限制
立即查看

资源下载