Composer脚本不能直接重构目录结构,需组合shell命令、PHP脚本和Composer调度实现;关键步骤包括安全移动目录、修正命名空间与use语句、更新autoload配置并执行dump-autoload。

Composer脚本本身不能重构目录结构
Composer 的 scripts 是用来触发命令的钩子,不是文件操作工具。它不提供移动、重命名、拆分目录的能力,也不能自动修改 PHP 命名空间或类引用。所谓“一键重构目录”,实际是靠组合外部命令(如 mv、sed、find)+ 自定义 PHP 脚本 + Composer 调度来完成的。
用 scripts 调用 shell 命令做基础目录搬移
适合简单场景:比如把 src/ 下所有内容移到 app/,并更新 autoload 配置。关键点在于命令必须可重复执行、失败时有提示、不影响未提交的变更:
- 在
composer.json的"scripts"里加一条:"move-src-to-app": "if [ -d 'src' ] && [ ! -d 'app' ]; then mv src app && echo '✅ Moved src → app'; else echo '⚠️ Skipped: src missing or app already exists'; exit 1; fi"
- 运行
composer run move-src-to-app,而不是过时的composer script - 注意 Windows 用户得用 PowerShell 脚本或改用
robocopy,原生mv不可用 - 别在
scripts里写多行复杂逻辑——维护困难,错误难调试,建议抽成独立bin/move-structure.php
真正安全的重构得靠 PHP 脚本 + 命名空间修正
目录搬动只是第一步,PHP 类路径、use 语句、new 实例化、PSR-4 映射全得同步更新。纯 shell 做不到这点,必须用 PHP 解析 AST 或至少用正则批量替换(需谨慎):
- 写一个
bin/refactor-namespace.php,用nikic/php-parser读取所有.php文件,修改namespace和use语句(例如从App\Src\→App\Domain\) - 在
composer.json中注册:"refactor-ns": "php bin/refactor-namespace.php --from='App\\Src' --to='App\\Domain'"
- 务必先
git status确认工作区干净,再跑脚本;脚本开头应加备份逻辑(如复制原始文件到backup/) - 不要信任全局
sed -i替换 —— 它会误改字符串字面量、注释、JSON 值,导致语法错误
Composer autoload 更新后必须 dump-autoload
改完目录和命名空间,composer.json 里的 "autoload"(尤其是 "psr-4")必须手动对应调整,否则 composer dump-autoload 生成的映射表还是旧的:
- 比如原配置:
"autoload": { "psr-4": { "App\": "src/" } }→ 改为"autoload": { "psr-4": { "App\": "app/" } } - 然后必须显式执行
composer dump-autoload -o(-o启用优化,跳过扫描) - 如果项目用了
classmap,还得检查"autoload-dev"和"exclude-from-classmap"是否需要同步清理 - 跑一次
composer validate,确认 JSON 结构和 autoload 字段合法
最麻烦的不是移动文件,而是让所有地方——IDE、测试、CI、依赖包的反射调用——都立刻识别新路径。漏掉一处 use 或一个硬编码路径,运行时才报 Class not found,这种问题往往要翻 log 才发现。











