Controller-Service-Model职责边界划分:实战中的三层解耦技巧
最近重构老插件时发现很多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层
记住:每当你犹豫代码该放哪层时,就说明当前分层还不够干净!
最新打赏

