应将配置文件放在扩展包的 config/ 目录下(如 config/my-package.php),并通过框架的发布机制(如 laravel 的 php artisan vendor:publish)或手动引入,使主项目识别并加载。

扩展包里怎么放配置文件才被主项目识别
Composer 本身不处理配置文件加载,它只管把代码复制进 vendor。配置文件要生效,得靠框架(如 Laravel、ThinkPHP)或你手动在主项目中引入。所以“放哪”不重要,“怎么让框架读到”才是关键。
常见做法是把配置文件放在扩展包的 config/ 目录下,比如 config/my-package.php,内容为标准 PHP 数组返回:
<?php return [
'enabled' => true,
'timeout' => 30,
];
但仅放进去没用——必须显式发布或合并。不同框架机制不同,不能假设自动加载。
Laravel 扩展包如何自动发布配置文件
Laravel 要求你在服务提供者(ServiceProvider)中调用 publishes() 并注册 loadRoutesFrom() 或 mergeConfigFrom(),否则 php artisan vendor:publish 根本找不到你的配置。
必须满足以下条件:
-
composer.json中"type"设为"laravel-package"(非必需但利于生态识别) - 服务提供者类里重写
boot()方法,写明:$this->publishes([__DIR__.'/../config/my-package.php' => config_path('my-package.php')], 'my-package'); - 同时在
register()或boot()中加:$this->mergeConfigFrom(__DIR__.'/../config/my-package.php', 'my-package');,否则首次运行时配置为空 - 主项目
config/app.php的providers数组需手动添加该服务提供者(除非用了自动发现,且composer.json的extra.laravel.providers正确声明)
ThinkPHP 扩展包怎么加载配置
ThinkPHP 没有 publish 机制,依赖服务提供者中的 register() 方法手动加载。它不自动扫描 config/ 目录,也不读取 extra 配置。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
典型写法是在服务提供者的 register() 中写:
$this->app->config->load(__DIR__.'/../config/my-package.php', 'my_package');
注意三点:
- 路径必须用
__DIR__向上定位,不能依赖当前工作目录 - 第二个参数是配置分组名(如
'my_package'),之后通过config('my_package.timeout')访问 - ThinkPHP 8 默认不启用自动发现,必须在主项目的
config/app.php的providers中显式写入服务提供者类全名
为什么本地开发时改了配置文件却没生效
根本不是缓存问题,而是配置压根没被加载。Composer 安装后不会执行任何 PHP 逻辑,服务提供者不注册,配置就永远静默失效。
排查顺序如下:
- 确认主项目
composer.json的require已写对包名,且已执行composer update vendor/name(不是install) - 检查服务提供者是否在主项目配置中注册;Laravel 可运行
php artisan package:discover强制刷新自动发现缓存 - 在服务提供者
boot()或register()开头加throw new \Exception('loaded');,看是否抛异常——不抛说明根本没被实例化 - Windows 下 symlink 失败会导致
vendor/vendor/name是复制体而非链接,改配置文件后实际改的是源目录,但主项目读的是旧副本;用dir vendor\vendor\name看是否为“快捷方式”类型
最常被忽略的一点:配置文件路径拼错(比如少了个 ..),或者服务提供者类命名空间与 composer.json 的 autoload.psr-4 不一致,导致类根本无法自动加载——此时连构造函数都不会执行。










