类找不到、模板不渲染、路由404、数据库连不上,本质是ThinkPHP按规则自动加载/解析时路径、命名空间、配置或环境不匹配:PSR-4要求namespace与目录严格一致;view_path需带./;URL重写需服务器支持;database.php的prefix、debug、认证插件须匹配环境。

类找不到、模板不渲染、路由 404、数据库连不上——这些不是你代码写错了,而是 ThinkPHP 在“按规则找东西”,而你没给它对的路标。
Class 'appcontrollerIndex' not found 是路径和命名空间没对齐
这个错误几乎占新手报错的 70%,根本原因不是文件丢了,而是框架在 PSR-4 自动加载下“认不出你是谁”。ThinkPHP6 要求 namespace 和磁盘路径严格一致,差一个字母大小写、多一层目录、少一个反斜杠,都会失败。
-
app/controller/Index.php的命名空间必须是namespace appcontroller;,不能是AppController或app/controller/(末尾斜杠) - Linux 服务器上,
Index.php和index.php是两个文件;Windows 开发时没问题,一上线就报错 - 用
composer dump-autoload -o刷新自动加载映射,尤其改过命名空间或移动过文件后 - 检查
composer.json中的"autoload": {"psr-4": {...}}是否仍指向"app\" : "app/"
模板 fetch() 报错“模板文件不存在”
不是文件真没了,而是 $this->fetch() 默认拼接路径的逻辑和你预期不一致。ThinkPHP6 不再默认读 app/view/,而是按 config/view.php 配置的 view_path 和 view_suffix 去找。
- 确认
config/view.php中'view_path' => './app/view/'(注意开头的./,漏掉会变成绝对路径) -
view_suffix默认是'html',但如果你的模板叫index.php,就得显式写$this->fetch('index', 'php') - 控制器里调用
$this->fetch('admin/index'),实际查找的是app/view/admin/index.html,不是app/view/index/admin.html - 刚装完
topthink/think-view却没生效?检查config/app.php的'default_return_type' => 'html'和中间件是否启用视图支持
路由访问 404,但 route:list 显示已注册
说明路由规则被定义了,但没被匹配到——常见于入口配置、URL 模式、或伪静态未开启。
立即学习“PHP免费学习笔记(深入)”;
- Apache 环境必须启用
mod_rewrite,且项目根目录有正确.htaccess;Nginx 需在 server 块中添加try_files $uri $uri/ /index.php?$query_string; - 访问
/index.php/index/index能通,但直接访问/index/index404?说明 URL 重写没生效 - 命令行执行
php think route:list,确认目标路由确实在列表里,且 HTTP 方法(GET/POST)匹配 - 自定义路由写在
route/app.php还是route/route.php?TP6 默认只加载route/app.php,route.php已废弃
Db::table()->select() 返回空数组,但数据明明存在
不是查不到,是连接、前缀、字段或编码把查询拦在了半路。尤其当本地能跑、线上挂掉时,90% 是环境差异导致的静默失败。
- 打开
config/database.php的'debug' => true,看日志里有没有真实执行的 SQL;没有 SQL 日志,说明连数据库都没连上 - 检查
'prefix'配置:表名是tp_user,但配置了'prefix' => 'think_',那Db::table('user')实际查的是think_user,自然为空 - MySQL 8+ 默认认证插件是
caching_sha2_password,PHP 7.4 以下可能不兼容,需改用mysql_native_password -
Db::getLastSql()放在查询后立刻调用,能拿到最终拼出的 SQL,复制到 Navicat 里一试便知是不是语句本身有问题
最常被忽略的,是开发环境和生产环境的 APP_DEBUG 开关不同——关掉调试模式后,很多错误不再抛出,只默默返回空或 false。别靠“看起来正常”判断,每个关键节点都用 dump() 或日志打点确认值到底是什么。


















