codeigniter 4虽不内置模块市场,但可通过composer安装兼容扩展、封装服务类注入、采用hmvc模块结构三种方式安全复用功能;需规范组织代码、统一管理配置与资源。

CodeIgniter4 本身不内置“模块市场”,但它的设计天然支持功能模块化引入——关键不是“装插件”,而是按规范组织代码、利用框架机制复用逻辑。下面说清楚怎么把常用功能(比如用户管理、日志分析、API认证)安全、可维护地加进你的项目。
用 Composer 安装官方或社区扩展包
这是最标准、最省心的方式,尤其适合通用功能(如 JWT 认证、邮件发送、缓存驱动等)。
- 优先查 packagist.org 搜索
codeigniter4/jwt、codeigniter4/escaper等带codeigniter4/前缀的包,它们经过 CI4 兼容性验证 - 执行
composer require codeigniter4/jwt-implementation(以实际包名为准),Composer 会自动注册 PSR-4 命名空间 - 安装后,多数包会提供服务注册说明——通常只需在
app/Config/Services.php中调用$this->aliases或$this->singletons注册即可 - 别直接 require vendor/autoload.php —— CI4 的 autoloader 已接管,手动加载反而破坏命名空间解析
把功能封装成独立服务类再注入使用
自己写的或第三方轻量逻辑(比如短信发送器、Excel 导出器),推荐做成服务类,走构造函数注入,而不是全局函数或静态调用。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 新建
app/Services/SmsSender.php,类实现接口或继承基类(可选),确保命名空间为App\Services - 在
app/Config/Services.php的init()方法里注册:$this->singleton('sms', static function ($config) { return new \App\Services\SmsSender(); }); - 控制器中直接注入:
public function __construct(\App\Services\SmsSender $sms),框架自动实例化并传入 - 这样既解耦又方便单元测试——换模拟对象只需改服务注册,不用动业务逻辑
通过 HMVC 方式复用完整功能模块
如果要引入的是带路由、视图、模型的一整套功能(比如后台权限系统、文章 CMS),HMVC 是更合适的结构。
- 把模块目录(如
app/Modules/Auth)放在app/Modules/下,内部结构保持 MVC 分层 - 用社区方案(如
wiredesignz/codeigniter-modular-extensions)配合app/Config/Autoload.php添加 PSR-4 映射:$psr4['Auth'] = APPPATH . 'Modules/Auth/'; - 模块内控制器仍需继承
CodeIgniter\Controller,路由写在模块自己的Routes.php并通过$routes->addModule('auth')加载 - 跨模块调用用
service('controller')->execute('Auth::login'),它走完整生命周期,能复用中间件和过滤器
配置与资源文件统一管理
模块附带的配置、语言包、迁移文件不能乱放,必须进对应框架目录,否则框架找不到。
- 配置类放
app/Config/,命名匹配类名(AuthConfig.php→App\Config\AuthConfig),用config('AuthConfig')调用 - 语言文件放
app/Language/zh-CN/auth_lang.php,键名加前缀避免冲突('auth.login_failed' => '登录失败') - 数据库迁移文件放
app/Database/Migrations/,文件名含时间戳,运行php spark migrate自动识别 - 静态资源(JS/CSS)必须放在
public/下,别放app/里——Web 服务器无法直接访问,且违反隔离原则










