thinkphp mvc重构核心是分层归位:控制器仅调度、服务层承载业务、模型专注数据契约、视图零逻辑,严格遵循psr-4命名与目录规范。

ThinkPHP 使用 MVC 架构做代码重构,关键不在“重写”,而在“分层归位”——把该在哪儿的代码,放回它该在的地方,并按规范约束命名、职责与协作方式。不追求炫技,而重稳定、可测、易协同。
控制器只做调度,拒绝业务逻辑
控制器本质是请求入口和流程协调者,不是业务处理器。常见错误是把验证、计算、第三方调用全堆进 action 方法里。
- 接收请求参数后,立即交由验证器校验(
Validate或validate()) - 校验通过后,仅调用服务层方法(如
$this->userService->register($data)),不处理返回结果的具体含义 - 返回统一格式:成功用
success(),失败用error(),不拼接 HTML 或手动构造 JSON - 避免在控制器中直接 new 模型或操作数据库,所有数据操作委托给模型或服务
服务层承载核心业务,模型专注数据契约
ThinkPHP 的 app/service/ 目录是业务逻辑的主战场,模型(app/model/)则应严格保持“数据映射+基础关系”的纯粹性。
- 服务类以
Service结尾(如UserRegisterService),命名体现动宾结构,方法名用 camelCase(如sendVerificationSms()) - 模型中只定义字段、关联、自动完成、验证规则等与数据结构强相关的内容;不写发邮件、调支付、写日志等跨域逻辑
- 复杂业务需拆解为多个小服务,再由编排服务(Orchestration Service)组合调用,便于单元测试和复用
- 模型间关联尽量用
hasOne/hasMany等内置方法声明,避免手写 JOIN 查询
命名与目录严格遵循 PSR-4 + ThinkPHP 约定
规范不是束缚,而是降低团队认知成本的基础设施。ThinkPHP 8 默认支持 PSR-4,必须让命名空间和物理路径完全对齐。
- 类名首字母大写驼峰(
OrderRefundService),文件名与类名一致(OrderRefundService.php) - 控制器方法、服务方法、模型属性统一用小驼峰(
getUnpaidOrders()、isVerified) - 常量、配置键、环境变量全部大写加下划线(
MAX_LOGIN_ATTEMPTS、DB_HOST) - 目录名全小写,多词用下划线(
app/service/payment/,而非app/service/Payment/) - 每个 PHP 文件末尾保留且仅保留一个空行
视图零逻辑,模板只负责渲染
视图不是“能写 PHP 就随便写”的地方。ThinkPHP 模板引擎支持原生 PHP,但最佳实践是禁用执行能力,只允许变量输出与简单判断。
- 禁止在模板中查询数据库、调用服务、处理敏感数据
- 所有判断逻辑(如权限、状态展示)应在控制器或服务中算好,传入布尔值或枚举态(如
'can_edit' => true) - 复用区块用
{extend}和{block},公共样式/脚本抽成common模板 - 前端交互逻辑(如表单提交、分页跳转)优先走 API + AJAX,视图只作初始渲染兜底
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











