Codeigniter 4:Model与Entity Classes角色及Entity类功能解析
CodeIgniter 4: Models vs Entity Classes 角色、场景及Entity功能详解
一、Models的核心角色
Models是CodeIgniter 4中直接对接数据库的访问层,核心职责是封装所有数据库操作:
- 负责CRUD(创建、读取、更新、删除)、查询构建、数据验证(通过
$validationRules)、数据过滤等。 - 本质是把数据库操作从控制器/业务逻辑中抽离,保持MVC架构的职责分离,避免在业务代码里硬写SQL。
- 适合简单场景:比如小项目、基础配置管理等只需要基础增删改查的模块,直接用Model就能搞定。
二、Entity Classes的功能与用途
Entity是数据库记录的面向对象封装,把原本的数组型查询结果转换成带有行为的对象,核心是让数据和相关业务逻辑绑定在一起:
1. 数据封装与属性访问
把数据库字段转为对象属性,用$user->name替代$user['name'],更符合面向对象编程习惯,代码可读性更高。
2. 自动数据处理(访问器/修改器)
通过自定义getXxx()(访问器)和setXxx()(修改器)方法,统一处理字段的读写逻辑,避免重复代码:
- 比如读取日期字段时自动转为Carbon对象,方便日期操作;
- 设置密码时自动生成哈希值,不用每次在Model或控制器里手动处理。
示例代码:
namespace App\Entities; use CodeIgniter\Entity\Entity; use Carbon\Carbon; class User extends Entity { // 自动将指定字段转为Carbon日期对象 protected $dates = ['created_at', 'updated_at']; // 修改器:设置密码时自动哈希 public function setPassword(string $password): void { $this->attributes['password'] = password_hash($password, PASSWORD_DEFAULT); } // 访问器:获取用户名时自动转为大写 public function getUsername(): string { return strtoupper($this->attributes['username']); } }
3. 封装业务逻辑
把和实体相关的业务逻辑直接写在Entity里,让代码更内聚:
- 比如给User Entity添加
isAdmin()方法判断用户权限,或者sendWelcomeEmail()方法处理用户注册后的邮件发送逻辑; - 这样所有和User相关的逻辑都集中在一处,后期维护更方便。
示例代码(续上面的User Entity):
// 自定义方法:判断是否为管理员 public function isAdmin(): bool { return $this->attributes['role'] === 'admin'; }
4. 数据格式化与脱敏
可以在Entity里统一处理数据输出格式,比如格式化手机号、隐藏敏感字段(如密码),避免在多个地方重复处理。
三、适用场景对比
| 场景类型 | 用Model还是Entity? |
|---|---|
| 简单CRUD、小项目/模块 | 只用Model |
| 有复杂业务逻辑的实体(如用户、订单) | 结合Model+Entity |
| 需要统一处理字段格式/加密 | 用Entity |
| 追求面向对象、高可维护性 | 用Entity |
四、正确应用方式
Entity不直接操作数据库,所有数据库操作仍由Model完成,Model负责返回Entity对象:
- 在Model中指定
$returnType为对应的Entity类:
namespace App\Models; use CodeIgniter\Model; use App\Entities\User; class UserModel extends Model { protected $table = 'users'; protected $returnType = User::class; // 指定返回User Entity protected $allowedFields = ['username', 'password', 'role', 'created_at']; }
- 在控制器/业务代码中使用:
$userModel = new \App\Models\UserModel(); $user = $userModel->find(1); // 调用Entity的访问器 echo $user->username; // 自动输出大写的用户名 // 调用Entity的自定义业务方法 if ($user->isAdmin()) { // 执行管理员专属逻辑 } // 用修改器设置密码(自动哈希) $newUser = new \App\Entities\User(); $newUser->username = 'test_user'; $newUser->password = '123456'; // 自动转为哈希值 $userModel->save($newUser);
内容的提问来源于stack exchange,提问作者Listantiyo Wiharjanto
相关产品推荐
相关产品推荐

