控制器应只负责接收请求、调用服务、返回响应;其余业务逻辑(如if-else嵌套、多次db操作、手动拼sql、重复校验等)须拆至service层、request/validate类、视图层等,按业务域划分service并确保方法单一职责,避免新“大泥球”。

控制器里塞了200行业务逻辑,该拆哪?
直接拆:把 if-else 套娃、数据库连写5次、手动拼SQL、重复校验参数的代码,全移出控制器。控制器只做三件事:接收请求、调用服务、返回响应。其余全是干扰项。
常见错误现象:IndexController.php 里出现 Db::table()->where()->join()->order()->limit() 连写,或混着 Excel 导出、短信发送、第三方回调验证;这类代码一旦要加缓存或换数据库,改得头皮发麻。
- 优先提取成独立 Service 类,比如
UserOrderService,方法名直说意图:calculateRefundAmount()、notifyThirdPartyAfterPay() - 校验逻辑下沉到 Request 类(ThinkPHP 6+)或自定义
Validate类,别在控制器里写if (empty($data['mobile'])) - 模板渲染、JSON 返回统一收口,避免同一控制器里既有
return view()又有return json()混用
Service 层怎么组织才不变成新“大泥球”?
Service 不是垃圾桶,不能建个 CommonService 把所有方法全塞进去。它得按业务域切分,且方法必须单一职责。
使用场景:用户下单、优惠券核销、库存扣减——这三个动作哪怕都在订单流程里,也该分属 OrderService、CouponService、StockService,而非挤在 OrderService 里写满 300 行。
- 方法粒度控制在“一个动词 + 一个名词”,如
deductStockBySkuId(),拒绝handleOrderComplete()这种黑盒方法 - 跨 Service 调用走接口(interface),而非直接 new 实例,方便后续 mock 或替换实现
- 事务边界必须清晰:只有明确需要原子性的操作才进同一个
Db::transaction(),别为图省事把查库存、写日志、发消息全包进去
模型层还在写 protected $table = 'user'?该升级了
ThinkPHP 的模型不该是数据库映射的搬运工。过度依赖 BaseModel 继承和全局 protected $autoWriteTimestamp = true,会让业务逻辑被框架约定绑架。
性能影响:在列表页用 UserModel::with('profile', 'orders')->select(),如果 orders 关联没加索引或没限制数量,一次请求可能触发几十次 SQL 查询。
- 关联查询务必显式约束:用
->limit(5)或->where('status', 'paid'),别依赖前端传参过滤 - 复杂统计、多表聚合,别硬套 ORM,直接用
Db::query()写原生 SQL,注释写清为什么不用模型 - 敏感字段(如密码、手机号)在模型的
$hidden或$visible中显式声明,别靠控制器临时unset()
路由和中间件已经暴露控制器臃肿问题
如果你发现多个路由指向同一个控制器方法(比如 /api/v1/order 和 /admin/order 都调 OrderController@index),或者在控制器开头反复写 if ($this->request->isAjax()),说明职责早已越界。
容易踩的坑:用中间件强行“补救”控制器混乱,比如写个 CheckAuthMiddleware 去判断角色再跳转不同逻辑分支,结果把权限、业务、协议适配全搅在一起。
- 前后端分离项目,API 路由走
app/api目录,后台管理走app/admin,控制器命名带上上下文,如Api\OrderController、Admin\OrderController - 协议适配(JSON/XML/HTML)交给视图层或响应类,控制器只管提供数据结构,别出现
if ($format === 'xml') { echo '<xml>...</xml>'; } - 中间件只做守门人:鉴权、日志、限流。任何含
->save()、->send()、->verify()的逻辑,都不是中间件该干的
真正难的不是拆分,是每次新增需求时,能忍住不在控制器里“顺手加一行”。那行代码不会立刻报错,但三个月后,你会在凌晨两点对着 OrderController.php 第 472 行发呆,想不起当初为啥要在这里调用微信支付回调验证。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











