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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:18:03