解决 Laravel 10 升级冲突的核心是定位阻塞源:运行 composer why-not laravel/framework:^10.0 查逆向拒绝链,删 vendor 和 lock 文件重置依赖图,精简 psr-4 映射为 "App\": "app/" 并执行 composer dump-autoload -o,显式声明 doctrine.dbal.connection: ~ 解决服务缺失。

解决 Laravel 10 的 composer.json 冲突,核心不是强行跳过或删文件,而是看清谁在“卡住”升级路径——尤其是框架大版本跃迁时,冲突往往来自旧映射、隐式服务移除、PSR-4 自动发现启用等结构性变化。
先定位真正阻塞点,别猜
报错里出现 don't install laravel/framework v10.x 或卡在 Resolving dependencies,说明 Composer 找不到满足所有约束的版本组合。此时要立刻运行:
-
composer why-not laravel/framework:^10.0—— 输出会从底向上列出完整阻断链,最后一行是你的composer.json根声明,往上每行标着(required by xxx v1.2.3),那就是源头 -
composer prohibits monolog/monolog:3.0.0(把包名换成你实际冲突的)—— 查清哪些已装包明确拒绝该版本 -
composer show --tree | grep "laravel/framework"—— 看是否被某个子依赖(如spatie/laravel-backup)钉死在 v9
清理旧配置,适配 Laravel 10 新规则
Laravel 10 默认启用 PSR-4 自动发现,并移除了对 app/Providers/ 等子目录的手动映射。若你 composer.json 中还保留着:
"psr-4": {
"App\": "app/",
"App\Providers\": "app/Providers/"
}
就会导致 AppServiceProvider 找不到。应改为:
- 只留一行:
"App\": "app/",删掉所有子路径显式声明 - 执行
composer dump-autoload -o(加-o强制优化) - 清缓存:
php artisan config:clear && php artisan cache:clear
处理关键服务缺失(如 doctrine.dbal.connection)
Symfony 6.2+ 和 Laravel 10 默认不再自动暴露 doctrine.dbal.connection 为 public service。老代码中写 $container->get('doctrine.dbal.connection') 就会报 ServiceNotFoundException。
- 在
config/packages/doctrine.yaml中显式声明:doctrine.dbal.connection: ~ - 或改用类型注入:
DoctrineDBALConnection,更安全 - 验证是否生效:
bin/console debug:container --types | grep DoctrineDBALConnection
升级策略:逐个击破,不全量更新
直接 composer update 在旧项目里极易卡死或引入意外主版本变更。推荐做法:
- 删掉
vendor/和composer.lock(大版本升级必须重置锁文件) - 先跑
composer require laravel/framework:^10.0 --with-dependencies,让它主动重算关联依赖 - 再逐个升级其他关键包:
composer require spatie/laravel-backup:^9.0(确认它已支持 L10) - 用
composer show --outdated看带(major)的包,它们大概率需手动适配
不复杂但容易忽略











