CodeIgniter 4如何从数据库动态加载Config/App.php配置项
实现方案:从数据库加载App配置的locale相关属性
步骤1:创建配置存储表
首先在数据库中新建表存储自定义配置,示例SQL如下:
CREATE TABLE `app_settings` ( `id` int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `key` varchar(100) NOT NULL UNIQUE, `value` text NOT NULL, `type` varchar(20) NOT NULL DEFAULT 'string' ); -- 初始化对应的locale配置项 INSERT INTO `app_settings` (`key`, `value`, `type`) VALUES ('defaultLocale', 'zh-CN', 'string'), ('negotiateLocale', '0', 'boolean'), ('supportedLocales', '["zh-CN","en","ar"]', 'array');
步骤2:注册前置事件修改配置
使用框架的pre_system事件(该事件在系统启动前、配置刚加载完且核心服务未初始化时触发)加载数据库配置并修改App属性,在app/Config/Events.php中添加如下代码:
Events::on('pre_system', function () { // 读取数据库中对应的配置项 $settings = db_connect()->table('app_settings') ->whereIn('key', ['defaultLocale', 'negotiateLocale', 'supportedLocales']) ->get() ->getResultArray(); // 第二个参数传true获取可修改的配置实例,默认返回的是只读共享实例 $appConfig = config('App', true); foreach ($settings as $setting) { // 按存储类型格式化配置值 $value = match($setting['type']) { 'boolean' => (bool)$setting['value'], 'array' => json_decode($setting['value'], true), default => $setting['value'] }; // 赋值修改App配置属性 $appConfig->{$setting['key']} = $value; } // 手动重置本地化服务,确保加载新配置 \Config\Services::locator(null, true); \Config\Services::language(null, $appConfig, true); });
注意事项
- 该方案修改的配置在当前请求全局生效,所有后续调用的服务都会读取修改后的配置
- 如果仅需要在特定请求中修改配置,修改完成后手动重置对应的本地化服务即可生效
内容的提问来源于stack exchange,提问作者Hazrat Bilal
相关产品推荐
相关产品推荐

