ThinkPHP的MVC架构是控制器收请求、模型管数据、视图做展示的实践规范:控制器负责调度与参数获取,模型封装数据操作与业务规则,视图专注模板渲染,三者边界清晰、协作有序。

ThinkPHP 的 MVC 架构不是抽象概念,而是你每天写代码时必须踩准的节奏:控制器收请求、模型管数据、视图做展示,三者各守边界又紧密联动。理解它,不靠死记,而在于清楚每个环节“谁该做什么、不能做什么、出错了往哪查”。
控制器(C):请求入口与流程调度员
控制器是整个请求链的第一站,放在 app/controller/ 目录下,类名和文件名必须一致(如 User.php 里定义 class User),且必须继承 think\Controller 或 app\BaseController。
- 方法名不能以下划线开头,否则框架直接忽略,访问会 404
- 返回字符串直接输出;返回数组默认转 JSON(API 场景下很顺手)
- 获取参数统一用
$this->request->param('name'),别直接用$_GET或$_POST - 需要中间件控制权限或日志,可在类顶部声明:
protected $middleware = ['CheckAuth'];
模型(M):数据操作与业务规则封装者
模型对应数据库表,放在 app/model/ 下,类需继承 think\Model。它不只是“查数据库”,更是业务逻辑的容器。
- 表名自动映射规则:类名
User→ 表名user(可手动指定protected $table = 'my_users';) - 验证、自动完成、事件钩子(如
before_insert)都写在模型里,控制器只调用User::create()或User::where(...)->update() - 禁止
new User()实例化,必须走静态方法或容器注入,否则丢失模型特性 - 关联查询(如用户→文章)直接在模型中定义
hasMany,调用时$user->articles就能拿到集合
视图(V):模板渲染与前端交付层
视图不等于 HTML 文件,而是由框架模板引擎驱动的动态输出层,默认路径为 app/view/,命名需与控制器方法对应(如 Index/index.html 对应 Index::index())。
- 模板中用
{\$name}输出变量,{:date('Y-m-d', \$time)}调用函数,支持原生 PHP 但不推荐混写 - 布局模板(如
layout.html)用{__CONTENT__}插入子模板内容,避免重复写 header/footer - 静态资源(CSS/JS/图片)一律放 public/ 目录,引用写
- 开启调试模式时,模板修改实时生效;生产环境记得开启模板缓存,提升渲染速度
三者协同的关键细节
MVC 不是机械分工,而是有明确协作契约:
- 控制器绝不直接拼 SQL 或 echo HTML,只负责“决策”——该查谁、该跳哪、该给谁数据
- 模型不处理 URL 或 HTTP 状态,只专注数据合法性、一致性与关系表达
- 视图不写业务判断逻辑(比如权限校验),只做展示适配;复杂逻辑提前在控制器中计算好传入
- 路由(
route/route.php)是连接控制器的桥梁,Route::get('user/:id', 'user/read')这类映射写清楚,URL 才能准确落到方法上
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











