thinkphp起步常见404因默认强制路由模式,需配置有效路由、规范控制器命名;db::name()才支持前缀、软删除等完整模型逻辑;模板中禁用数据库操作;命令类需composer dump-autoload刷新加载。

路由定义后访问 404 是最常见的起步卡点
ThinkPHP 默认开启强制路由模式,没配路由就直接 404,不是框架坏了,是它默认不走“/index.php?s=xxx”那种传统入口。新手常以为控制器方法写对了就能访问,结果浏览器一刷就报错。
- 检查
app/route.php是否至少有一条有效路由,比如Route::get('hello', 'index/hello'); - 确认控制器命名规范:类名必须是
IndexController(首字母大写 + Controller 后缀),方法名用小驼峰,如hello,不能写成helloAction - 如果想临时关闭路由强制模式,可在
config/app.php中设'url_route_must' => false,但上线前务必改回来——否则 URL 不可控
Db::table() 和 Db::name() 别混用
两者都查数据库,但行为差异直接影响后续调试成本。Db::table() 直接操作原始表名,绕过模型层所有配置;Db::name() 才走完整模型逻辑,包括数据表前缀、软删除字段、时间自动写入等。
- 用
Db::name('user')时,框架会自动拼上前缀(如tp_user),而Db::table('tp_user')必须写全名,且不识别delete_time这类软删除字段 - 批量插入用
Db::name('log')->insertAll($data)能触发自动时间写入;换成table()就得手动补create_time - 关联查询、事件钩子、自动转换器这些高级能力,只在
name()下生效
模板中 {:func()} 和 {php}...{/php} 都该少用
ThinkPHP 模板语法本意是隔离逻辑与视图,但新手容易把判断、循环甚至数据库调用塞进模板里,导致后期无法复用、难以测试、缓存失效快。
-
{:date('Y-m-d', $time)}这种简单格式化可以,但{:Db::name('config')->where('k','site_name')->value('v')}属于严重越界 -
{php}...{/php}在新版中默认禁用,需在config/template.php开启'tag_lib_php' => true,但开启后等于放弃模板安全沙箱 - 真正该放模板里的,只有变量输出、条件判断(
{if}{/if})、循环({volist}{/volist})和内置函数调用
命令行执行 php think 报错 “Class not found” 的真实原因
不是命令没装好,大概率是 Composer 自动加载没刷新。ThinkPHP 的命令类(如 think\command\Make)依赖 PSR-4 自动加载规则,一旦新增或移动了命令类文件,就必须重生成 autoload。
- 先运行
composer dump-autoload,不是install或update - 确认命令类放在
app/command/下,且命名空间是app\command,类名结尾必须是Command(如HelloCommand) - 如果用的是多应用模式,命令类路径和命名空间要对应应用名,比如
app/admin/command/AdminHelloCommand,命名空间就得是app\admin\command
ThinkPHP 的“约定大于配置”在初期省事,但每个约定背后都有明确的加载顺序和路径规则。跳过文档直接抄代码,大概率会在路由解析、模型初始化、模板编译这三个环节反复卡住——它们不报具体错误,只默默返回空或 404。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











