如何在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
相关产品推荐
相关产品推荐

