CodeIgniter中无数据库表关联的非模型类:命名与存放方案?
在CodeIgniter中存放非数据库绑定实体类的方案
这是个非常典型的CodeIgniter架构疑问,我来给你分享一套在标准结构下的可行方案:
一、命名规范
这类封装外部服务返回数据、和数据库表无绑定的对象,本质属于数据传输对象(DTO)或者值对象(Value Object)。命名上就用你现在的OSMAddress这种PascalCase大驼峰格式就好,直接体现它的业务含义,不需要额外加前缀或后缀,保持直观简洁就行。
二、存放位置
根据你使用的CodeIgniter版本,有两种适配的存放方式:
1. CodeIgniter 3 版本
框架默认没有专门的实体类目录,你可以手动在application目录下新建一个entities文件夹(或者叫objects、models/entities也可以,看你团队习惯),专门用来存放这类非数据库绑定的实体类。
比如你的OSMAddress类就放在:
application/entities/OSMAddress.php
为了让框架能自动加载这个类,有两种配置方式:
- 方式一:在
application/config/autoload.php里,把entities目录添加到$autoload['packages']或者自定义自动加载规则; - 方式二:用Composer的自动加载,在项目根目录的
composer.json里添加:
"autoload": { "psr-4": { "App\\Entities\\": "application/entities/" } }
然后执行composer dump-autoload,之后就可以通过命名空间use App\Entities\OSMAddress;来调用类了。
2. CodeIgniter 4 版本
CI4框架本身就内置了app/Entities目录,专门用来存放这类实体类,直接把OSMAddress.php放进去就行,框架会自动处理类的加载,完全贴合你的需求。
三、实践建议
- 这类实体类要保持单一职责:只负责封装数据和简单的属性操作(比如给
OSMAddress加一个getFullAddress()方法来格式化完整地址字符串),不要包含业务逻辑、数据库操作或者外部API调用; - 如果这类实体类数量较多,可以按业务模块再细分子目录,比如
entities/location/OSMAddress.php,方便后续维护管理。
内容的提问来源于stack exchange,提问作者Peter K.
相关产品推荐
相关产品推荐

