You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CodeIgniter 3中定义服务类并沿用Java架构模式开发?

在CodeIgniter 3中实现实体-服务-控制器架构方案

一、核心适配思路

完全可以沿用Java的分层模式,只需对CodeIgniter 3的原有结构做针对性调整:

  • 控制器:直接使用框架自带的Controllers层,仅负责接收请求、调用服务、返回响应,不处理业务逻辑
  • 实体:不要复用CI自带的Model(CI原生Model是数据库操作类),单独新建纯实体类目录,只做数据封装和基础属性操作
  • 服务层:新增独立的服务目录,作为业务逻辑的核心载体,协调实体与数据访问操作

二、具体实现步骤

1. 定义独立实体类(Entities)

在application目录下新建entities文件夹,每个实体是纯OOP类,仅封装属性和get/set方法,不涉及数据库操作:

// application/entities/User.php
class User {
    private $id;
    private $name;
    private $email;

    public function getId() {
        return $this->id;
    }

    public function setId($id) {
        $this->id = $id;
        return $this;
    }

    // 其余属性的getter/setter方法
}

2. 数据访问层(CI原生Model)

保留CI自带的Models层,专门负责数据库CRUD操作,仅做数据读写,不包含业务逻辑:

// application/models/UserModel.php
class UserModel extends CI_Model {
    public function getById($id) {
        return $this->db->get_where('users', ['id' => $id])->row_array();
    }

    public function insertUser($data) {
        $this->db->insert('users', $data);
        return $this->db->insert_id();
    }

    // 其他数据库操作方法
}

3. 实现服务层(Services)

在application目录下新建services文件夹,服务类作为业务逻辑的核心,协调实体与数据访问:

// application/services/UserService.php
class UserService {
    private $userModel;

    public function __construct() {
        // 借助CI实例加载Model
        $CI =& get_instance();
        $CI->load->model('UserModel');
        $this->userModel = $CI->UserModel;
    }

    public function getUserById($id) {
        // 从Model获取原始数据
        $userData = $this->userModel->getById($id);
        // 转换为实体对象
        $user = new User();
        $user->setId($userData['id'])
             ->setName($userData['name'])
             ->setEmail($userData['email']);
        return $user;
    }

    public function saveUser(User $user) {
        // 从实体提取数据
        $data = [
            'name' => $user->getName(),
            'email' => $user->getEmail()
        ];
        // 调用Model完成数据库写入
        $userId = $this->userModel->insertUser($data);
        $user->setId($userId);
        return $user;
    }

    // 其他业务逻辑方法(如用户校验、权限判断等)
}

4. 控制器调用服务层

在控制器中加载服务类,仅做请求转发和响应处理:

// application/controllers/UserController.php
class UserController extends CI_Controller {
    private $userService;

    public function __construct() {
        parent::__construct();
        // 加载服务类
        $this->load->library('services/UserService');
        $this->userService = new UserService();
    }

    public function detail($id) {
        $user = $this->userService->getUserById($id);
        $this->load->view('user/detail', ['user' => $user]);
    }

    public function add() {
        if ($this->input->post()) {
            $user = new User();
            $user->setName($this->input->post('name'))
                 ->setEmail($this->input->post('email'));
            $savedUser = $this->userService->saveUser($user);
            redirect('user/detail/' . $savedUser->getId());
        }
        $this->load->view('user/add');
    }
}

三、关于你提到的架构图可行性

你给出的分层架构图(实体-服务-控制器分层,服务层依赖实体与数据访问层)完全符合OOP思想,和上面的实现逻辑一致,完全可以采用。这种分层模式能有效解耦各模块职责,便于后续维护和扩展,和Java中的分层设计逻辑完全对齐。

内容的提问来源于stack exchange,提问作者Nathindu Himansha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 04:45:31