支持自动发现的composer扩展包必须同时满足框架扫描逻辑、composer加载规则和安装钩子触发三重条件:服务提供者类名须以serviceprovider结尾且命名空间与psr-4严格匹配;composer.json中extra字段需精准配置laravel.providers或think.providers并正确转义;type必须为library或laravel-package;自动发现依赖post-autoload-dump钩子,ci环境禁用脚本需手动执行package:discover。

支持自动发现的 Composer 扩展包,不是“写完就能被 Laravel/ThinkPHP 自动识别”,而是必须同时满足框架扫描逻辑、Composer 加载规则、安装时钩子触发三重条件。漏掉任意一环,php artisan vendor:publish 或 php think service:discover 都会静默失败。
服务提供者类必须严格符合框架命名与加载规范
框架不会动态扫描目录,只按配置中写的完整类名去加载——哪怕只是大小写错一个字母或命名空间少一层,就直接跳过,不报错。
- Laravel 要求服务提供者类名以
ServiceProvider结尾,且命名空间必须和composer.json中autoload.psr-4声明完全一致(例如"YourNamePackage": "src/"→ 类必须在src/YourName/Package/PackageServiceProvider.php) - ThinkPHP 要求服务提供者实现
thinkService接口,并在register()中调用$this->app->bind()或$this->app->singleton() - 类文件必须真实存在于声明路径下;Windows 下路径缓存可能导致 IDE 显示正常但运行时报
Class not found,此时需composer dump-autoload -o强制刷新
composer.json 的 extra 字段必须精准匹配框架预期格式
框架只读 vendor/composer/installed.php(Composer 2+)里的 extra 内容,而不是你本地改完就生效的原始 composer.json。所以字段名、嵌套层级、字符串值都必须一字不差。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- Laravel:必须写
"extra": { "laravel": { "providers": ["YourName\Package\PackageServiceProvider"] } }—— 注意双反斜杠转义,且不能有dont-discover干扰 - ThinkPHP:必须写
"extra": { "think": { "providers": ["YourName\Package\PackageServiceProvider"] } }—— 框架只认think.providers这个 key - type 字段必须是
"library"或"laravel-package";"vcs"或"package"类型会被 Laravel 直接忽略
自动发现不是安装完就立刻生效,它依赖 post-autoload-dump 钩子
composer require 成功 ≠ 服务提供者已注册。真正触发发现的是 Composer 安装完成后执行的 post-autoload-dump 脚本,而这个脚本又依赖 installed.php 更新和框架命令存在。
- CI 环境常用
composer install --no-scripts,这会跳过所有钩子,包括package:discover—— 必须显式补上php artisan package:discover --force - 本地用
path仓库开发时,composer update vendor/name是必须步骤;只改代码不update,包就不会写入installed.php,框架根本“看不见”它 - 修改了
composer.json后,必须运行composer dump-autoload(更新installed.php),再手动执行php artisan package:discover --force或php think service:discover刷新缓存
验证是否真的被发现,别信表象
运行 php artisan tinker 然后 app()->make(YourClass::class) 报错,不代表没发现——可能只是服务提供者没绑定、没注册、或者 bootstrap/cache/packages.php 缓存了旧结果。
- 先看
bootstrap/cache/packages.php是否包含你的包名及'providers' => [...]数组;没有说明发现失败 - 再查
vendor/composer/installed.php,搜索你的包名,确认extra字段里有正确的laravel.providers或think.providers - 最后运行
composer show yourname/your-package,检查输出中type:和autoload:是否符合预期 —— 这是最接近 Composer 实际视角的验证方式
最常被忽略的一点:自动发现只负责注册服务提供者,不等于自动发布配置、迁移或视图。即使 packages.php 里有了你的包,php artisan vendor:publish 仍需手动执行,且服务提供者内必须有 $this->publishes() 调用,源路径还必须真实存在、可读。










