
升级后路由不生效,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。
立即学习“PHP免费学习笔记(深入)”;
在 config/template.php 中添加 ‘function’ => [‘url’, ‘date’, ‘substr’](按需补充)更推荐改用命名路由:先在路由定义中加 ->name(‘home.index’),模板中写 {:url(‘home.index’)},避免硬编码路径如果项目用了 think-view 扩展包,请确认版本与 TP6 兼容(需 >= v2.0.0),旧版会因反射调用失败导致 url 函数不可用事情说清了就结束。版本迁移最麻烦的不是语法改写,而是那些“以前能跑,现在不报错但结果不对”的隐性行为变化——尤其是字段缓存、模板函数白名单、中间件作用域这三处,容易漏测。

评论(0)