ThinkPHP的MVC高效依赖主动组织与严格分工:控制器只调度、模型管规则、视图纯展示,三者边界清晰;路由需显式配置,目录结构须规范。

ThinkPHP 的 MVC 不是开箱即用的自动模式,而是靠你主动组织、明确分工、严格守界才能真正高效起来。关键不在多,而在准——控制器不掺业务、模型不碰输出、视图不执行逻辑,三者各守其位,协作才顺。
控制器:只调度,不干活
控制器本质是请求中转站,不是业务执行者。它只该做三件事,多一步都算越界:
- 统一接收参数(input('id')、$this->request->param('page')等,不直接读$_GET或$_POST)
- 调用模型方法获取或变更数据(UserModel::get($id)、OrderModel::create($data))
- 把结果数组传给视图(return view('user/detail', ['user' => $user])),不拼HTML、不echo、不跳转
模型:管“能不能”,不管“要不要”
模型是业务规则的唯一出口。所有判断、校验、关联、事务都该在这里沉淀,而不是散落在控制器里:
- 注册时邮箱是否已存在、密码是否符合强度,必须在模型层用validate()或自定义方法拦截
- 数据库操作统一走$this->save()、static::destroy()或Db::name('user'),禁用原生SQL拼接
- 关联查询写在模型的hasMany()、belongsTo()等方法里,控制器只需$user->posts
视图:纯展示,零副作用
视图文件(.html 或 .php 模板)必须是“哑”的——它不能决定流程、不能查数据库、不能创建对象:
立即学习“PHP免费学习笔记(深入)”;
- 所有变量必须由控制器显式传入,模板里只允许{$user.name}或{{ $list|date='Y-m-d' }}这类安全取值与过滤
- 禁止出现new UserModel()、file_get_contents()、include外部PHP文件等执行语句
- 循环、条件用内置标签({volist name="list" id="item"}...{/volist}),不写原生PHP代码块
路由与结构:让路径直通逻辑
默认路由虽能跑通,但显式配置才是可控开发的起点:
- 在route/route.php中定义语义化路由,比如Route::get('api/user/:id', 'api.UserController@info');
- 目录结构严格遵循标准:app/controller/、app/model/、app/view/,不混放、不跨层
- 控制器类名用PascalCase(如ArticleController),方法用camelCase(如listByCategory)



















