说说几个核心判断:新手搭建 ThinkPHP 演示项目,最忌讳的是一头扎进文档里,把所有概念啃完了再动手。实际操作中,真正需要记住的无非是一条命令——一条能帮你直接生成一个可运行的项目骨架,从而绕过环境配置中那些层出不穷的“报错、404、白屏”陷阱。只要三步走,事情就清晰了:确认环境真的就绪、用正确方式生成骨架、然后启动服务并验证能否正常访问。
确认 PHP 环境真实可用
很多人看到终端里 php -v 输出了一个 8.x 版本号,心里立马就踏实了——等等,真就这么简单?很多时候框架加载不了,恰恰是因为 php.ini 根本没生效,或者那些关键扩展一个都没启用。这里有几个“硬核实操”:
- 运行
php --ini,看清楚 Loaded Configuration File 那一行指向的是不是你自己修改过的php.ini(千万别是php.ini-development这个默认模板) - 然后跑
php -m | grep -E "mbstring|openssl|pdo|fileinfo"(Mac/Linux),或者 Windows 用户用php -m | findstr "mbstring openssl pdo fileinfo"。这四项必须全部出现,缺一不可 - 如果哪个扩展缺失,打开
php.ini,找到对应extension=的行,把前面的分号去掉。Windows 下写extension=fileinfo.dll,Linux/macOS 则用extension=fileinfo.so - 改完之后一定要重启终端再验证——Windows 用户最容易忽略的一个坑是,PATH 环境变量里依然指向了旧版本的 PHP 目录,改了半天等于白忙
用 create-project 生成完整项目骨架
这时候有个常见误区:有人会直接用 composer require topthink/think,结果发现只装了一堆代码,项目结构压根没搭起来,运行起来直接报 Class 'thinkApp' not found。记住,必须用 create-project,这样才能生成包含 public/、app/、think 入口的完整项目结构。
- 先换个国内镜像提速:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 然后执行:
composer create-project topthink/think demo(这条命令会自动拉取最新的稳定版) - 如果你怕版本变动带来兼容问题,也可以指定一个版本号:
composer create-project topthink/think demo 8.0.12 - 项目生成完毕后,进入目录:
cd demo,后面的操作都在这个目录里进行
启动服务并验证 API 链路
能跑 php think run 不代表能访问页面。真正关键的是 Web 根目录是否准确指向了 public/,以及入口文件有没有被绕过。
- 在项目根目录执行
php think run,当看到输出http://127.0.0.1:8000时,意味着服务已经启动 - 打开浏览器,访问这个地址。如果能看到 “ThinkPHP V8.x” 的欢迎页,那才算真正成功了
- 如果碰到 404 或者直接空白页,先检查几个地方:命令是否在项目根目录下执行的?
public/index.php这个文件还在吗?.env文件里APP_DEBUG=true有没有打开? - 还有一个临时验证链路的方法:运行
php think make:controller Api/Hello,然后在生成的控制器方法里返回一段 JSON,再访问http://127.0.0.1:8000/api/hello,看数据是否能正常返回
快速配置数据库并读取一条数据
演示项目不需要搞多复杂的业务逻辑,但至少得验证数据库通路是通的。ThinkPHP 6+ 对数据库配置的结构要求比较严格,不能再像以前那样直接写一个扁平数组。
- 打开
config/database.php,确保配置的结构是:'connections' => ['mysql' => [...]], 'default' => 'mysql'这样的嵌套格式 - 像密码这类敏感字段,一定要通过
env('DB_PASSWORD')读取,千万别硬编码在文件里 - 先创建一个测试库:
CREATE DATABASE tp_demo DEFAULT CHARSET utf8mb4; - 再新建一张简单的表:
CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50)); INSERT INTO user(name) VALUES ('demo'); - 最后在控制器里写一行测试代码:
return Db::name('user')->find();,然后访问对应的路由,看返回结果里有没有那条数据
