扩展配置文件必须放在extra目录下,即application/extra/路径中,框架启动时自动加载其中的php返回数组配置文件,无需额外配置或load_ext_config函数。

扩展配置文件必须放在 extra 目录下
ThinkPHP 5 的扩展配置不是靠 LOAD_EXT_CONFIG(那是 TP3 的写法),而是约定死的路径:application/extra/。只要把 PHP 配置数组文件放进去,框架启动时自动合并加载。
比如你想加一个数据库额外配置,就新建 application/extra/database.php,内容返回数组:
<?php return [
'DB_BACKUP_HOST' => '10.0.1.100',
'DB_BACKUP_PORT' => 3307,
];
之后就能直接用 \think\Config::get('DB_BACKUP_HOST') 或 config('DB_BACKUP_HOST') 读取。
- 文件名(不含
.php)会成为配置键的前缀,但默认是平铺到根配置层 —— 即database.php里的键不会自动挂到database.下,除非你手动写成嵌套数组 - 如果想保留命名空间,得在文件里主动返回二维结构,例如
return ['database' => [...]],再通过config('database.DB_BACKUP_HOST')访问 -
extra目录不存在要手动创建,框架不会自动建
config() 和 \think\Config::get() 的行为差异
两者都能读扩展配置,但底层逻辑不同:前者是助手函数,后者是类静态方法。多数场景下没区别,但要注意以下两点:
- 助手函数
config('key')在未传值时只读;传第二个参数(如config('key', 'default'))可设默认值,但不支持写入 -
\think\Config::get('key')同样只读;若要动态写配置(仅当前请求有效),得用\think\Config::set('key', 'value') - 读取嵌套键时都支持点号语法,例如
config('database.DB_BACKUP_HOST'),前提是原始配置数组本身是嵌套结构
为什么 Config::get() 读不到 extra 里的配置?
常见原因就三个,按优先级排查:
- 文件没放在
application/extra/下,比如错放到了application/conf/或application/config/ - 文件名含非法字符或大小写不一致(Linux 环境严格区分大小写,
Database.php≠database.php) - 配置文件语法错误导致 require 失败(比如末尾少了个分号、用了短标签
但服务器禁用了),此时框架静默跳过该文件,不报错也不提示
验证是否加载成功,最简单方式是在控制器里执行 dump(config());,看返回数组里有没有你定义的键。
扩展配置的加载顺序和覆盖规则
TP5 中配置合并顺序固定:惯例配置 → 应用配置(config.php)→ 扩展配置(extra/*)→ 模块配置 → 场景配置 → 动态设置。这意味着:
- 同名键,后加载的会覆盖先加载的 —— 所以
extra/database.php里的DB_HOST会覆盖config.php里的同名项 - 扩展配置之间无先后,
extra/下所有 PHP 文件按字母序加载(a.php先于b.php),但一般不依赖这个顺序 - 别指望用扩展配置去“补全”某个二维数组字段,比如
config.php定义了'database' => ['host'=>'127.0.0.1'],你在extra/db.php里写return ['port'=>3306],它不会自动 merge 进database数组,只会平铺为顶层键port
真正需要合并嵌套结构时,得在单个扩展文件里自己写完整数组,或者改用动态配置 + 数组合并逻辑来兜底。











