thinkphp6开发手册
ThinkPHP6 的手册入口文件从 public/index.php 开始,整个框架的手册启动流程绕不开它。我见过不少开发者把项目根目录直接暴露在 web 根目录下,手册这在 TP6 里是手册个隐患——框架特意把入口文件放进了 public 目录,就是手册为了让应用代码和可访问资源隔离开。你要是手册用 Nginx,记得把 root 指向 public 而不是手册项目根目录,否则 .env 文件分分钟能被下载走。手册
安装方式现在官方推荐 composer。手册跑一句 composer create-project topthink/think tp6demo,手册等它拉完依赖就能跑起来。手册不过国内网络环境你懂的手册,建议先切到阿里云镜像。手册我上次帮同事装的手册时候没切源,卡在 topthink/framework 那里转了好几分钟,手册最后直接 timeout 报错。切完源后十几秒就完事了。
目录结构上,TP6 比 TP5 清爽了不少。app 目录默认单应用模式,你要是需要多应用,得额外装 think-multi-app 扩展。这里有个坑:很多从 TP5 升上来的开发者习惯性去找 application 目录,结果发现根本没有。别慌,app 就是新的 application。控制器、模型、中间件这些都在 app 下面按模块划分。
路由这块变化挺大。TP6 默认强制路由,什么意思呢?就是你不定义路由规则,直接访问 /index/hello 这种路径会报错。想恢复类似 TP5 的自动解析,得在 config/route.php 里把 'url_route_must' => false 打开。我个人的做法是生产环境保持强制路由,开发阶段先关掉,省得每加一个方法就要去写规则。
中间件现在成了核心机制。以前 TP5 的钩子行为被中间件取代了,全局中间件在 app/middleware.php 注册,应用中间件在 app/应用名/middleware.php。写一个简单的鉴权中间件大概长这样:
public function handle($request, \Closure $next) { if (!$request->session('user_id')) { return redirect('/login'); } return $next($request); } 注意 handle 方法的第二个参数必须是 Closure,返回 $next($request) 才能继续往下走。我见过有人直接 return true,结果后面的控制器压根不执行,排查了半天。
数据库操作我个人觉得比 TP5 顺手。Db 类支持链式调用,也支持模型。快速查询用 Db::name('user')->where('id', 1)->find() 就够了。要是业务复杂,建议用模型,关联查询写起来清晰得多。TP6 的模型关联支持 hasOne、hasMany、belongsTo 这些常规类型,还多了 hasOneThrough 和 hasManyThrough 这种远程关联,实际项目里处理多级表关系能省不少事。
模板引擎还是 ThinkTemplate,语法跟 TP5 基本兼容。但注意 TP6 默认不安装视图扩展,你得 composer require topthink/think-view。装完之后在控制器里用 View::fetch() 或者继承 BaseController 直接用 $this->fetch()。模板文件放在 app/view 目录下,跟控制器名对应。比如 Index 控制器的 hello 方法,模板路径就是 app/view/index/hello.html。
调试模式在 .env 文件里控制,APP_DEBUG = true 的时候错误信息很详细,连 SQL 语句都给你打出来。上线前千万记得改成 false,不然数据库表结构都能被人看到。我有次忘了改,第二天看日志发现有人一直在扫 /index/index 试图触发异常来获取路径信息。
TP6 的验证器用起来也还行。独立验证用 Validate::rule([...])->check($data),或者直接写验证器类。场景验证通过 scene 方法切换。有个细节:验证规则里 'require|max:25' 这种写法,max 后面的数字是字节数不是字符数,中文一个字占三字节,你得按实际需求调整。
缓存驱动默认是文件,生产环境建议换 Redis。配置在 config/cache.php 里改 type 为 redis,然后填好 host、port、password。TP6 的缓存标签功能挺好用,Cache::tag('user')->set('user_1', $data, 3600),后面要清理直接 Cache::tag('user')->clear(),比记 key 名方便。
整体来说 TP6 比 TP5 更规范,但学习曲线也陡了一点。尤其是依赖注入和容器那块,不熟悉的话看源码会有点吃力。不过一旦习惯了,写出来的代码确实更干净。