必须在composer.json顶层autoload字段中正确配置psr-4规则,如"myvendor\mypackage\": "src/",命名空间须双反斜杠结尾、路径以/结尾、大小写与文件结构严格一致,并执行composer dump-autoload生效。

composer.json 必须声明 psr-4 自动加载规则
没有 autoload 配置,即使包装进 vendor/,类也根本不会被自动加载。Laravel、ThinkPHP 等框架都依赖 Composer 的 autoload 机制发现和注册类。
常见错误是只写了 "src/" 路径,却漏掉命名空间前缀,或大小写不一致:
-
"psr-4": { "MyVendor\MyPackage\": "src/" }—— 命名空间必须以双反斜杠结尾,且与 PHP 文件中namespace声明完全一致 - 路径
src/下必须存在对应结构,比如src/MyPackageServiceProvider.php的 namespace 必须是MyVendorMyPackage - 若用
src/以外的目录(如lib/),必须同步改autoload和实际文件位置
服务提供者类名和位置要满足框架发现规则
Laravel 自动发现(Auto-Discovery)只认两类:类名以 ServiceProvider 结尾,且命名空间与 psr-4 规则对齐;否则它直接跳过扫描。
例如 Laravel 10+ 中,以下配置会失效:
-
src/Providers/HelperProvider.php—— 类名不是ServiceProvider结尾 -
src/MyPackageService.php—— 少了Provider后缀 -
"psr-4": { "MyVendor\MyPackage\": "src/" },但类文件在src/Providers/下且没调整命名空间
正确做法:把服务提供者放在 src/ 根下,命名为 MyPackageServiceProvider.php,namespace 为 MyVendorMyPackage。
extra.laravel.dont-discover 必须显式清空
Laravel 9+ 默认屏蔽所有包的自动发现,除非你在包的 composer.json 中明确告诉它“请扫描我”。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
这个字段不是可选的,而是开关:
-
"dont-discover": []—— 允许自动发现(推荐) -
"dont-discover": ["*"]或"dont-discover": ["myvendor/mypackage"]—— 强制禁用,服务提供者永远不会被注册 - 该配置必须写在**扩展包自己的**
composer.json里,不是主项目的
漏配或误配后现象:执行 composer require myvendor/mypackage 成功,但 php artisan vendor:publish 找不到配置,app()->make() 报类不存在。
本地开发时 path 仓库的 name 和版本必须严格匹配
用 "type": "path" 方式本地调试,最容易卡在“装得上但不生效”。根本原因不是路径错,而是三处对不齐:
- 主项目
composer.json的repositories数组中,url必须是相对路径(如"../mypackage"),绝对路径在 Windows 上静默失败 - 本地包目录下的
composer.json中name字段(如"myvendor/mypackage")必须和composer require命令里的完全一致(大小写敏感) - 版本必须用分支名,如
dev-main或dev-develop;写1.0.0会被忽略,因为 path 源不读取version字段,只看 Git 当前分支
改完本地包代码后,必须运行 composer update myvendor/mypackage(不是 install),否则 symlink 不会刷新,主项目看到的仍是旧代码。
真正难的不是写多少配置,而是每一处都得对得严丝合缝:命名空间拼写、目录结构、Git 分支状态、repositories 的位置——少一个,包就只是躺在 vendor/ 里,不会被框架看见。










