业务插件开发:如何用Service层吃掉Controller的胖逻辑?

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
插件开发 206 浏览 31 回复

最近重构老插件时发现Controller里堆了300行业务逻辑,连Redis操作和PDF生成都塞在里面。分享下我们的分层改造方案:

1. Controller瘦身黄金法则:

// 反面教材
public function orderCreate() {
    // 参数校验
    // 风控检查
    // 库存计算
    // 优惠券核销
    // 订单持久化
    // 短信通知
    // ......
}

// 改造后
public function orderCreate() {
    $params = $this->validate();
    return $this->orderService->create($params); 
}

2. Service层拆解技巧:

• 按业务域划分子Service(PaymentService/InventoryService)
• 公共逻辑抽离到Helper层(如ExcelExportHelper)
• 领域对象作为参数传递而非数组(避免到处写$data['order_id'])

3. Model层该不该背锅?

常见误区是把Service逻辑下沉到Model,结果变成:

// 过度赋能的Model
$user->calculateLoyaltyPoints();
$user->sendBirthdayCoupon();

我们的实践:
• Model只做数据存取和简单计算
• 跨表操作交给Service
• 领域事件触发放在Service

改造后代码可测试性明显提升,Mock服务时不再需要启动全套HTTP请求。你们的分层边界是怎么划定的?

评论31
回复 · 31
Knox
Knox 初级漫步繁花 · #20 ·
支持了~
Chase
Chase 初级麟宫绮梦 · #19 ·
写得很清楚,收藏了
JoelSky
JoelSky 新手净世白羽 · #18 ·
学到了,顶一下
Luna
Luna 新手暖弦漫旋 · #17 ·
同求,期待更新
曹雪
曹雪 初级 · #16 ·
学到了,顶一下
OpenField
OpenField 初级流金绮梦 · #15 ·
感谢分享!
NorthWind
NorthWind 初级 · #14 ·
已解决,谢谢楼主
Finn
Finn 初级璃海华章 · #13 ·
已解决,谢谢楼主
Ivy
Ivy 初级圣羽星庭 · #12 ·
支持了~
NightOwl
NightOwl 初级璃梦花海 · #11 ·
感谢分享!
SkyWalker
SkyWalker 初级璃海华章 · #10 ·
感谢分享!
Blake
Blake 初级赏金猎人 · #9 ·
同求,期待更新
徐静
徐静 新手净世白羽 · #8 ·
感谢分享!
懒懒的星星
懒懒的星星 初级星灿心语 · #7 ·
同求,期待更新
自由的骑士
自由的骑士 中级 · #6 ·
写得很清楚,收藏了
LunaSong
LunaSong 初级心屿荧途 · #5 ·
感谢分享!
MilesWolf
MilesWolf 初级暖弦漫旋 · #4 ·
写得很清楚,收藏了
听雨
听雨 新手心屿荧途 · #3 ·
同求,期待更新
SunnyDay
SunnyDay 新手流金绮梦 · #2 ·
写得很清楚,收藏了
朱娜丽
朱娜丽 新手时梦乐园 · #1 ·
学到了,顶一下
1 2
微信客服 微信客服 QQ官方交流群 QQ官方交流群