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

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对象:

  1. 在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'];
}
  1. 在控制器/业务代码中使用:
$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 23:12:40