laravel 的自动发现由 php artisan package:discover 实现,非 composer 本身功能;它读取 vendor/composer/installed.php 中的 extra.laravel.providers 字段,校验类型、autoload 和类存在性后写入 bootstrap/cache/packages.php,缺一不可。

自动发现不是 Composer 自己干的,是 Laravel 通过 php artisan package:discover 读取包的 composer.json 里 extra.laravel.providers 字段实现的——没装 Laravel 或跳过钩子,这机制就完全不生效。
怎么让 Laravel “看见”你的服务提供者
关键不是改完 composer.json 就完事,Laravel 不直接读你包里的文件,它只读 vendor/composer/installed.php(Composer 2+)或 vendor/composer/installed.json(Composer 1)。所以必须走完整链路:
- 在包的
composer.json中正确声明:"extra": {"laravel": {"providers": ["Vendor\Package\ServiceProvider"]}} - 确保该类已在包自己的
autoload.psr-4里注册(比如"Vendor\Package\": "src/") - 主项目执行
composer dump-autoload→ 更新installed.php - 触发
post-autoload-dump钩子 → Laravel 自动运行php artisan package:discover - 结果写入
bootstrap/cache/packages.php,下次启动才生效
为什么改了配置却没注册上
常见静默失败,根本不会报错,但服务提供者就是不加载。排查优先看这几点:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer show vendor/package输出里有没有laravel.providers字段?没有=Laravel 根本没解析到 - 包的
type字段是不是"library"或"laravel-package"?"vcs"或"package"类型会被 Laravel 直接忽略 - 服务提供者类名拼错、命名空间没 autoload、类文件不存在 →
package:discover静默跳过,不提示 - CI/CD 用了
composer install --no-scripts→ 钩子被跳过,packages.php根本没生成 - 本地用 path 仓库但没跑
composer update vendor/package→ 包没写进installed.php,Laravel 当它没装
自动发现 ≠ 自动发布资源
很多人以为启用了自动发现,配置文件、迁移、视图就自动落地了——这是最大误区。自动发现只做一件事:调用 $app->register(ServiceProvider::class)。
- 要发布配置,服务提供者里必须显式写:
$this->publishes([__DIR__.'/../config/package.php' => config_path('package.php')]) - 然后手动运行:
php artisan vendor:publish --provider="Vendor\Package\ServiceProvider" - Laravel 9+ 对源路径校验更严:如果
__DIR__.'/../config/package.php'不存在或不可读,publish命令会静默跳过,不报错也不复制 - 若想禁用某个包的自动发现,可在主项目
composer.json的extra.laravel.dont-discover数组里加它的 name
path 仓库下自动发现特别容易翻车
本地开发用 repositories.type: "path" 时,自动发现失效概率极高,因为路径和元数据匹配稍有偏差就全盘作废:
- 主项目
composer.json的repositories必须在顶层,不能嵌套;url必须是目录(如"../my-pkg"),不能是"../my-pkg/composer.json" - 本地包的
composer.json必须有合法name(大小写、分隔符逐字匹配)和version(哪怕写"dev-main") - 改了本地包代码后,
composer install不刷新符号链接,必须composer update vendor/package - Windows 下未开启开发者模式、Docker 容器没加
--cap-add=SYS_ADMIN,symlink 会 fallback 成 copy,导致改代码不生效
最常被忽略的一点:所有缓存都是“惰性更新”的。packages.php 不会随 composer.json 变动自动重写,php artisan config:clear 清不掉它,得手动删或跑 php artisan package:discover --force。










