ThinkPHP的MVC架构需先理解分层职责再实践:Model封装数据规则与业务约束,View专注安全渲染,Controller仅作调度;须按路由、控制器、视图顺序搭建最小可运行结构,并用模型操作数据库、按业务语义拆分控制器与路由。

ThinkPHP 的 MVC 架构不是一上来就套模板的流程,而是需要分层建立理解闭环:先看清三者分工,再动手搭最小可运行结构,最后在真实协作场景中体会“为什么必须分层”。跳过认知节奏直接抄代码,后期改一个字段可能要动控制器、模型、视图、路由四处地方。
搞懂MVC各自干啥,别混淆职责
Model 不是“写SQL的地方”,而是封装数据规则和业务约束的类。比如用户注册时检查手机号格式、密码强度、是否已存在——这些逻辑写在 User 模型里,控制器只管调用 $user->validate($data)。
View 不是“拼HTML的文件夹”,而是专注渲染的模板层。它不处理数据库连接、不判断权限、不调用 service,只做一件事:把控制器传来的变量安全地展示出来,比如 {$user.name} 或 {:widget('header')}。
Controller 是“调度员”,不是“大杂烩”。它只接收请求参数、调用对应模型方法、决定返回 JSON 还是跳转页面、传哪些变量给视图。不查库、不校验、不渲染——这些都该交给 Model 或 View 去做。
立即学习“PHP免费学习笔记(深入)”;
从空项目跑通第一个 MVC 请求
用 Composer 创建新项目后,按顺序做四件事:
- 在
route/app.php写一条测试路由:Route::get('test', 'index/test'); - 在
app/controller/Index.php新建控制器,定义test()方法,返回简单字符串或view() - 在
app/view/index/test.html写一行模板,比如<h1>MVC 已就位</h1> - 启动内置服务器:
php think run,访问/test看是否渲染成功
这一步不涉及数据库,只为确认框架加载、路由分发、控制器执行、视图渲染整条链路畅通。
用模型操作数据库,别再硬写 Db::name
Db 类适合快速调试或后台脚本,但正式业务逻辑必须走模型。原因有三:
- 模型自动绑定表名、主键、时间戳字段,减少重复配置
- 可定义获取器(
getCreateTimeAttr)、修改器(setPasswordAttr)、关联关系(hasMany) - 便于单元测试——你 mock 的是一个类,而不是全局 Db 对象
例如创建 app/model/Article.php,继承 think\Model,再用 Article::where('status', 1)->select() 查询,比 Db::name('article')->where(...) 更易维护、更易复用。
路由与控制器命名要对齐业务语义
别为了省事把所有接口塞进 Index 控制器。按资源或功能域拆分:
-
UserController处理登录、注册、资料更新 -
OrderController处理下单、支付回调、发货状态 - 路由前缀统一加 group:
Route::group('api', function () { ... });
这样后期加中间件(如登录校验、API限流)或迁移到子域名时,只需改一组配置,不用翻几十个文件找 if (!login())。



















