Controller-Service-Model职责边界划分:实战中的三层解耦技巧

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

最近重构老插件时发现很多Controller里直接写SQL查询,Service层又混了页面渲染逻辑。分享下我们团队现在强制推行的分层规范:

1. Controller只做三件事:
- 接收请求参数(过滤+基础校验)
- 调用Service方法
- 返回响应/跳转

// 反例
function update_user() {
    $data = $_POST;
    if(empty($data['id'])) {
        wp_redirect('/error');
    }
    global $wpdb;
    $wpdb->update('users', $data); // 致命问题:SQL直接写在控制器
}

2. Service层黄金法则:
- 纯PHP业务逻辑(if/else/for等)
- 可调用多个Model方法组合业务
- 禁止出现SQL/HTML/HTTP相关代码

// 正例
class UserService {
    public function upgradeVip($userId) {
        $user = $this->userModel->find($userId);
        if($user->level < 3) {
            $this->userModel->updateLevel($userId, 3);
            $this->logModel->record($userId, 'VIP升级');
        }
    }
}

3. Model层严格限制:
- 只包含数据存取方法
- 每个方法对应单个原子操作
- 表名/字段名只在这一层出现

// 推荐写法
class UserModel {
    public function findByEmail($email) {
        return $wpdb->get_row(
            "SELECT * FROM {$this->table} WHERE email = %s", 
            sanitize_email($email)
        );
    }
}

特殊场景处理:
- 跨表事务放在Service层
- 复杂数据校验可抽离Validator类
- 视图渲染建议用单独Presenter层
记住:每当你犹豫代码该放哪层时,就说明当前分层还不够干净!

评论22
回复 · 22
倔强的月亮
倔强的月亮 新手赏金猎人 · #2 ·
同求,期待更新
小棠
小棠 初级 · #1 ·
写得很清楚,收藏了
1 2
微信客服 微信客服