composer 本身不支持自动发现,laravel 通过 post-autoload-dump 钩子调用 php artisan package:discover 实现该功能,该命令读取 vendor/composer/installed.php,检查 extra.laravel.providers 字段、类可加载性及包是否真实安装。

Composer 本身不支持“包的自动发现”——它只负责安装、解析依赖和生成自动加载器。所谓“自动发现”,是 Laravel(5.5+)等框架基于 Composer 的元数据和钩子机制自己实现的功能,不是 Composer 内置能力。
为什么 composer install 后 Laravel 才能自动注册服务提供者
Composer 在执行 post-autoload-dump 钩子时,会调用 Laravel 提供的脚本:php artisan package:discover。这个命令才是真正的“发现引擎”:
- 它读取
vendor/composer/installed.php(Composer 2+)或vendor/composer/installed.json(Composer 1),而不是遍历所有composer.json文件 - 对每个已安装包,检查其
composer.json中的extra.laravel.providers字段 - 验证类名是否可被自动加载(即已在
autoload或autoload-dev中声明) - 把有效条目写入
bootstrap/cache/packages.php,供应用启动时快速读取
所以如果你改了包的 composer.json 但没运行 composer dump-autoload,package:discover 就找不到类;如果禁用了 scripts(如 CI 中加了 --no-scripts),这一步根本不会触发。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
extra.laravel.providers 字段必须满足的三个硬性条件
哪怕格式完全正确,以下任一条件不满足,Laravel 就会跳过该包:
-
type字段必须为library或laravel-package(非必需但推荐),不能是vcs、package等类型 - 服务提供者类路径必须能被当前 autoloader 加载:即该类所在的命名空间需在包自己的
autoload.psr-4或autoload.files中声明 - 包必须已通过
composer require安装进vendor/,且vendor/composer/installed.php中有对应记录 —— 本地path仓库若未被composer update刷新,也不会出现在 installed 列表里
常见失效场景与快速排查点
遇到 php artisan package:discover 没反应、或 packages.php 里没你的包,先看这些:
- 运行
composer show your-vendor/your-package,确认包确实被识别并列出 —— 如果报错“Package not found”,说明 Composer 根本没把它当已安装包处理 - 检查
vendor/composer/installed.php是否包含你的包名和extra字段内容 —— 如果没有,package:discover不会读到任何东西 - 手动执行
php artisan package:discover --force,观察是否有Class not found报错 —— 这通常暴露 autoload 配置遗漏 - 确认没有在
config/app.php的dont-discover数组中误写了你的包名或通配符*
最常被忽略的是:Laravel 的发现逻辑只跑一次,且强依赖 installed.php 的完整性。它不解析源码、不扫描目录、也不关心你本地改了什么 —— 只认 Composer 最终写入的安装快照。










