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

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

最近重构老插件时发现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请求。你们的分层边界是怎么划定的?

评论11
回复 · 11
郭平
郭平 新手赏金猎人 · #11 ·
支持了~
🐱汽水🎐
🐱汽水🎐 初级星灿心语 · #10 ·
已解决,谢谢楼主
YukiRain
YukiRain 新手 · #9 ·
同求,期待更新
温柔的少年
温柔的少年 新手净世白羽 · #8 ·
同求,期待更新
Joel
Joel 新手清瑶问鼎 · #7 ·
感谢分享!
KateStar
KateStar 初级 · #6 ·
感谢分享!
WadeYang
WadeYang 新手璃海华章 · #5 ·
已解决,谢谢楼主
GoldenHour
GoldenHour 初级 · #4 ·
支持了~
郭宁
郭宁 初级 · #3 ·
已解决,谢谢楼主
SilverLake
SilverLake 新手流金绮梦 · #2 ·
写得很清楚,收藏了
安静的草莓
安静的草莓 初级净世白羽 · #1 ·
同求,期待更新
微信客服 微信客服 QQ官方交流群 QQ官方交流群