composer.json必须放在项目根目录,否则命令失效;库项目不生成vendor/且不提交,应用项目vendor/需与composer.json同级并.gitignore;PSR-4映射须 namespace结尾、路径相对且带斜杠,改后须运行dump-autoload。

Composer 本身不是框架,也不负责设置目录结构——它只认 composer.json 的位置和内容。项目目录怎么组织,取决于你是写库(library)还是应用(application),而这个判断直接决定 composer.json 放哪、vendor/ 能不能进 Git、autoload 怎么配。
composer.json 必须放在项目根目录,否则命令全失效
Composer 只在当前工作目录下找 composer.json,不会向上递归,也不支持子目录多配置。常见翻车场景:
- 把
composer.json塞进src/或app/,运行composer install会报错或生成错位的vendor/ - 误以为“模块化”就得每个子目录放一个
composer.json,结果 CI 构建时找不到主依赖 -
composer dump-autoload报路径错误,实际是执行位置错了——必须 cd 到composer.json所在目录再运行
验证方法:执行 pwd 确认当前路径,再看有没有 composer.json;没有就别硬跑命令。
库(library)和应用(application)的目录结构不能混用
结构差异本质是“谁负责安装依赖”:库由使用者装,应用自己装。这决定了 vendor/ 是否存在、是否提交、autoload 是否指向源码。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 库项目(如封装的 SDK、工具包):根目录只有
composer.json、src/、tests/、README.md;vendor/绝对不能有,也绝不能提交到 Git - 应用项目(如 Laravel、自研后台):根目录可有
public/(Web 入口)、config/、bin/,但vendor/必须和composer.json同级,且必须被.gitignore排除 - 错误做法:在库项目里跑
composer install,导致生成vendor/并意外提交;或在应用里删掉vendor/后不提交composer.lock,CI 构建时版本漂移
PSR-4 autoload 映射必须和文件系统、命名空间三者对齐
写错 "psr-4" 不会报配置错误,只会让类永远 Class not found。关键约束有三个:
- namespace 必须以反斜杠结尾:
"App\": "src/"✅,"App"❌ - 路径必须相对于
composer.json目录,且用正斜杠:"src/"✅,"./src/"❌,"src"❌ -
src/Http/Controllers/下的类,命名空间必须是App\Http\Controllers\,不能是AppHttpControllers或App\Http\Controller
改完 composer.json 的 autoload 后,必须手动执行 composer dump-autoload(上线用 -o),否则新规则完全不生效。
前端资源、配置文件、CLI 脚本要和 PHP 依赖物理隔离
PHP 代码和非 PHP 资源混放,会导致自动加载污染、部署误删、权限混乱。明确边界才能避免后期踩坑:
- Web 入口统一放
public/,里面只放index.php和静态资源(CSS/JS/images),index.php中 require 的vendor/autoload.php必须用相对路径(如require __DIR__.'/../vendor/autoload.php';) - 配置文件(
config/)、命令行脚本(bin/)、测试数据(fixtures/)不要放进src/,它们不属于可自动加载的类逻辑 -
filesautoload 类型慎用:列在里面的 PHP 文件会在每次请求时include_once,别塞数据库连接或初始化重的逻辑
最常被忽略的是 public/ 和 src/ 的引用关系——index.php 里的路径写死或相对错一层,上线后直接 500,但本地可能因 Web 服务器配置侥幸跑通。

















