ThinkPHP的MVC分工明确:模型专注数据规则与校验,控制器仅调度与响应,视图纯粹展示。三者边界清晰、协同直链,使逻辑更轻、维护更快。

ThinkPHP用MVC不是为了堆砌概念,而是把一件复杂的事拆成三件简单的事:谁管数据、谁管展示、谁来指挥。理清这三者的边界,逻辑自然就轻了。
模型(Model):只做跟数据有关的决定
模型不是数据库操作的搬运工,而是业务规则的守门人。比如用户注册,模型里该写密码加密、邮箱唯一性校验、默认头像生成——这些规则一旦定下,控制器就不用再操心“怎么验”“怎么存”。
- 避免在模型里 echo 或跳转,它只返回数据或抛异常
- 表单验证逻辑尽量收进模型的 validate() 方法,别散落在控制器里
- 复杂业务可分层:UserModel(数据层)、UserLogic(规则层)、UserService(调用层),用 D('User', 'Logic') 显式调用
控制器(Controller):只做调度,不做计算
控制器像快递中转站:收请求、找模型要结果、选视图填数据、发响应。它不该有 if-else 判断业务状态,也不该拼 SQL 或格式化时间。
- 一个方法尽量只对应一个明确动作,比如 index() 列表、read() 查详情、save() 提交
- 从模型拿到的数据,只做必要组装(如合并关联数据),不处理业务判断
- 重定向、JSON 输出、模板赋值是控制器的本职;密码生成、权限校验、日志记录应交给模型或中间件
视图(View):只负责“看见”,不负责“想到”
视图是纯展示层,它的变量都该来自控制器明确传递,不能自己查数据库、不能调模型方法、不能写 for 循环处理业务逻辑。
立即学习“PHP免费学习笔记(深入)”;
- 用 {$user.nickname} 直接输出,别写 getNickname(); ?>
- 条件展示用模板引擎语法 {if $user.status eq 1}激活{else}禁用{/if},而非 PHP 原生 if
- 公共区块(如导航、页脚)抽成单独模板,用 {include file="public/header"} 复用
拆开不是目的,协同才是关键。控制器调模型拿数据,模型稳稳返回结构化结果,控制器再原样塞给视图——链条越直,出错点越少,改起来越快。



















