thinkphp文件组织核心是“约定大于配置”:app/放业务代码、public/为唯一web入口、config/存纯配置、route/管url映射、runtime/交由框架自管;app内按controller/service/model/validate/middleware分层,路径与命名空间严格一致。

ThinkPHP 文件组织要便于维护,关键不是堆砌目录,而是让结构反映职责、匹配自动加载规则、降低协作成本。核心是“约定大于配置”落地到位,而不是追求视觉整齐。
按职责分清五大主干目录
项目根目录下必须明确区分这五个不可混用的区域:
-
app/:只放业务代码。控制器、模型、服务类、验证器、中间件全在这里,命名空间统一为
App\。别往里塞配置、视图或静态资源。 -
public/:唯一 Web 可访问入口。
index.php必须在此,所有 CSS/JS/图片也必须放public/static/或子目录。放错位置,浏览器直接 404。 -
config/:纯配置文件目录。数据库、缓存、日志、中间件等配置各成文件(如
database.php、cache.php),不写逻辑,不包含敏感信息硬编码。 -
route/:只管 URL 映射。一个模块一个路由文件(如
admin.php、api.php),用Route::group()按前缀归类,避免全堆在route.php里。 - runtime/:完全交给框架自动生成。部署时确保可写,但禁止手动编辑或提交到 Git。缓存、日志、模板编译都由它管理。
app/ 内部按层拆解,不按模块套娃
单应用模式下,不建议按 app/admin/、app/api/ 这种多模块结构切分,除非真有独立入口和权限体系。更推荐扁平分层:
-
app/controller/:只做请求接收、参数校验、调用 service、返回响应。方法名小驼峰(如userList),不写 SQL 或事务。 -
app/service/:放真正业务逻辑。比如 “创建订单并扣减库存并发送通知”,这类跨模型、带事务的操作全在这里。类名小驼峰(如OrderService),通过容器注入使用。 -
app/model/:专注数据映射。定义字段、关联、访问器,不处理 HTTP 请求对象或 session。 -
app/validate/:每个表单或接口一个验证器(如UserRegisterValidate),规则集中、复用方便。 -
app/middleware/:鉴权、日志、跨域等横切关注点。一个中间件只做一件事,命名体现意图(如CheckLoginMiddleware)。
严格遵守路径与命名空间一致性
ThinkPHP 的自动加载靠的是“命名空间路径 = 文件系统路径”,差一个字母就报 Class not found:
- 目录名全部小写:
controller、model、service—— 不是Controller或controllers。 - 类文件名首字母大写驼峰:
UserModel.php、AdminLoginController.php,且文件内class名必须完全一致。 - 模块名(如用于路由分组)必须小写+下划线:
admin、user_center,不能用Admin或UserCenter。 - 别把
config/放进public/,数据库密码可能被直接下载;也别把app/和public/放同一级再用软链绕,增加部署复杂度。
配置与资源分离,杜绝硬编码
维护性差往往始于配置散落:
- 所有环境相关值(数据库地址、API 密钥、开关标志)统一走
config/下的.env+env.php加载,不在代码里写死。 - 视图文件放在
app/controller_name/view/(如app/index/view/index.html),不单独建view/目录;语言包按模块放app/index/lang/zh-cn.php。 - 上传文件统一走
public/upload/,并在配置中定义上传根路径,避免在控制器里拼字符串。 - 第三方类库走
vendor/,自定义扩展类放extend/,不塞进app/或thinkphp/。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











