tp6升级后路由不生效因移除全局函数式定义,须在app/route.php中返回rulegroup实例;db查询返回null因字段缓存未生成,需运行php think optimize:schema;中间件须在app/middleware.php返回数组或显式调用middleware();模板url函数需加入function白名单或使用命名路由。

升级后路由不生效,Route::get 报错找不到方法
ThinkPHP 6.0+ 彻底移除了全局函数式路由定义,Route::get 等静态调用必须在 app/route.php 中注册,且该文件只在应用启动时加载一次。如果你沿用 TP5.x 的写法,在控制器里直接调用 Route::get,会触发 Call to undefined method think\Route::get()。
- 确认入口路由文件路径是否为
app/route.php(TP6 默认位置),不是route/route.php或其他自定义路径 - TP6 路由注册必须返回
think\route\RuleGroup实例,不能只是执行语句;常见写法是return Route::group(...) - 若使用多应用模式,路由文件应放在对应应用目录下,如
app/api/route.php,且需确保应用初始化时已加载
Db::table('user')->where('id', 1)->find() 返回 null,但数据明明存在
TP6 默认开启严格字段检查,Db 查询时若数据表无对应模型,且未显式指定字段列表,会尝试从数据库读取字段缓存;一旦缓存过期或未生成(比如首次部署没运行 php think optimize:schema),就可能跳过字段映射,导致类型转换失败或条件失效。
- 临时验证:加
->strict(false)测试,如Db::table('user')->strict(false)->where('id', 1)->find();若能查出,说明是字段缓存问题 - 生产环境务必运行
php think optimize:schema生成字段缓存,否则每次查询都走 SHOW COLUMNS,性能差且易出错 - 更稳妥的做法是为常用表定义模型类,并在模型中设置
protected $schema = [...],绕过自动探测
中间件注册方式变了,app/middleware.php 不再起作用
TP6 废弃了全局数组式中间件配置,所有中间件必须通过容器绑定或在 app/middleware.php 中返回闭包/类名数组 —— 但这个文件本身只对「应用级中间件」有效,而「路由级」或「控制器级」中间件必须显式调用 middleware() 方法注册。
- 全局中间件请统一写在
app/middleware.php,返回数组,如return [App\Middleware\CheckAuth::class]; - 路由组中启用中间件,必须用
->middleware(App\Middleware\CheckAuth::class),不能靠全局配置自动注入 - 注意中间件执行顺序:全局 → 路由组 → 路由规则,同级多个中间件按注册顺序执行,没有隐式优先级
模板中 {:url('index/index')} 渲染为空或报错
TP6 默认关闭了模板引擎的函数调用白名单,url 是系统函数,但未被列入默认允许列表,所以会被过滤掉,输出为空或触发 Template Error。
- 在
config/template.php中添加'function' => ['url', 'date', 'substr'](按需补充) - 更推荐改用命名路由:先在路由定义中加
->name('home.index'),模板中写{:url('home.index')},避免硬编码路径 - 如果项目用了
think-view扩展包,请确认版本与 TP6 兼容(需 >= v2.0.0),旧版会因反射调用失败导致 url 函数不可用
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










