ThinkPHP是结构清晰、可维护性强的PHP框架,其目录结构严格遵循职责分离原则:public为唯一Web入口,app存放业务逻辑,runtime需可写,config仅加载一级PHP文件,模块名须全小写。

如果您刚接触 PHP 开发并希望快速搭建一个结构清晰、可维护性强的 Web 应用,则 ThinkPHP 是一个典型且实用的选择。它通过约定优于配置的方式降低入门门槛,但若目录放置错误或命名不规范,将直接导致控制器无法加载、模板渲染失败、配置不生效等问题。以下是围绕 ThinkPHP 使用与项目目录结构展开的核心说明:
一、确认环境与安装框架
ThinkPHP 6 要求 PHP 版本不低于 7.1,并需启用 PDO 和 MBstring 扩展。框架依赖 Composer 管理,不可直接复制源码运行。
1、确保已安装 Composer 并配置国内镜像源,例如执行:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
2、在目标路径下执行命令创建项目:composer create-project topthink/think myapp
立即学习“PHP免费学习笔记(深入)”;
3、进入项目目录后启动内置服务器:cd myapp && php think run
4、浏览器访问 http://127.0.0.1:8000,出现欢迎页即表示基础环境就绪。
二、理解根目录关键组成部分
ThinkPHP 项目根目录不是扁平结构,每个子目录承担明确职责,删改或错放将破坏请求生命周期。
1、public/ 是唯一对外暴露的目录,必须包含 index.php 入口文件;所有静态资源(CSS/JS/图片)须置于 public/static/ 下,否则浏览器返回 404。
2、application/(ThinkPHP 5.x)或 app/(ThinkPHP 6.x)存放业务逻辑代码,该目录默认禁止 Web 直接访问,所有请求均由 public/index.php 转发进来。
3、runtime/ 必须对 Web 服务器进程用户(如 www-data、nginx)具备读写权限,否则首次访问会白屏且无错误提示(尤其当 APP_DEBUG=false 时)。
4、config/ 目录仅自动加载其一级 PHP 文件(如 database.php),子目录中的配置文件(如 config/database/mysql.php)不会被识别或合并。
三、掌握模块与控制器的命名约束
ThinkPHP 6 默认启用多应用模式,模块名参与路由解析与命名空间映射,大小写错误将引发类找不到异常。
1、app/ 下的模块目录名(如 admin、api)必须全部使用小写字母,不能为 Admin 或 API。
2、控制器类文件必须放在对应模块的 controller/ 子目录中,且文件名与类名严格一致,例如 app/admin/controller/Index.php 中定义 class Index。
3、检查 config/app.php 中的 'default_module' => 'index' 是否与实际存在的模块目录名完全匹配(全小写)。
4、若采用单应用模式,则 app/ 下不应存在子目录,所有控制器应直接置于 app/controller/,同时需禁用多应用配置。
四、区分视图模板路径与真实文件位置
视图并非静态 HTML,而是由控制器调用 view() 方法触发模板引擎解析,路径由框架自动拼接,非手动构造 URL 访问。
1、控制器中调用 $this->fetch('index') 时,框架按约定查找 app/index/view/index/index.html(ThinkPHP 6 默认模板路径规则)。
2、app/index/view/ 下的目录层级与控制器命名空间无关,仅用于组织模板文件;修改该路径需同步调整 config/view.php 中的 'view_path' 配置。
3、切勿将 app/index/view/index/index.html 文件拖入浏览器地址栏打开,此时看到的是原始模板代码或 PHP 解析错误,因其未经过框架调度流程。
五、验证与调试运行时行为
runtime 目录是运行状态的“黑匣子”,其内容反映框架是否正常初始化缓存、日志与模板编译机制。
1、首次访问页面后,检查 runtime/cache/ 是否生成 PHP 缓存文件;若为空,说明缓存未启用或目录不可写。
2、查看 runtime/log/ 下是否有按日期命名的日志文件;若无,确认 APP_DEBUG=true 且 log.level 配置未设为 emergency 级别。
3、清空 runtime/view/ 后刷新页面,观察是否重新生成编译后的 PHP 模板文件;若未生成,可能因模板语法错误导致编译中断。
4、执行命令行指令验证基础功能:php think version 输出框架版本,php think route:list 列出当前有效路由规则。



















