输入变量 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);
}
特点:声明式,方法签名即文档,支持类型约束,与请求解耦。
核心区别一览
虽然数据都来自 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 自身就清晰表达了意图,可读性极强。
资源定位用参数绑定,自动注入,清晰稳定;
操作选项用输入变量,灵活获取,按需组合。
记住这一条,你就掌握了控制器参数设计的最佳实践。
本站所有文章、数据、图片来源于网络,仅供学习使用,如有侵权,联系删除!