ThinkPHP 8.0 中路由参数自动转模型实例需显式调用 bind() 方法绑定变量与模型,键名须与路由变量完全一致且大小写敏感;主键非 id 时须在模型定义 $pk 或 bind 时指定字段;绑定失败默认返回 404 且不可跳过。

在 ThinkPHP 8.0 中实现路由参数自动转为模型实例,避免控制器里手动查数据库;不配置 bind 就拿不到模型对象,直接是 null 或触发 404。
必须显式调用 bind() 绑定变量与模型
ThinkPHP 不靠控制器方法的类型提示自动绑定,【必须在路由定义中显式调用 bind() 方法】,否则即使写了 User $user,$user 也是 null。
打开 routes/app.php,写法如下:
Route::get('user/:id', 'User/read')->bind(['id' => \app\model\User::class]);
注意:键名 id 必须和路由变量 :id 完全一致,大小写敏感;模型类需继承 think\Model。
主键不是 id 时要手动指定查询字段
若模型主键是 uid,而路由变量名也是 uid,但模型没声明 $pk = 'uid',TP 默认仍按 id 查,结果必 404。
方法一:在模型中定义主键
protected $pk = 'uid';
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
方法二:bind 时传入字段数组
Route::get('user/:uid', 'User/read')->bind(['uid' => [\app\model\User::class, 'uid']]);
这一步不能省——TP 不会自动映射 uid → uid,它只认默认 id,除非你明说。
绑定失败默认返回 404,不可跳过
第一步:确保模型存在且已正确引入命名空间,比如 use app\model\User;
第二步:检查数据库中是否存在对应主键值的记录;不存在就抛 HttpException(404);【这个行为不可关闭,也不走控制器逻辑】
第三步:如果需要自定义未找到响应(比如返回 JSON 提示),只能改写 bind 闭包,用 first() + abort() 替代默认逻辑。









