Laravel升级必须逐主版本迭代(如9→10→11),不可跨版本直升;需严格匹配PHP版本(如v11要求^8.2)、同步更新所有laravel/*生态包、手动处理结构变更(如目录移除、中间件重构)及废弃API(如Response::json())。
不能“无痛”,但可以大幅降低风险——Laravel 官方不提供跨主版本一键升级,必须逐级迭代(如 9 → 10 → 11),跳版本会触发大量废弃警告、类找不到、中间件签名变更等硬性报错。
为什么不能直接 composer update 到最新版
直接运行
通常会失败,因为:
PHP 版本不匹配:Laravel 11 要求
,而很多老项目还在用 7.4 或 8.0,
会卡在依赖解析阶段,报错类似
第三方包未同步升级:比如
、
、
都有严格对应的主版本号,一个没对齐就会导致
或服务提供者注册失败
框架内部结构剧变:Laravel 11 默认移除了
目录,改用基于命名空间的扁平结构,旧路由和控制器引用会全部失效
逐版本升级的实操节奏
以从 Laravel 9 升级到 11 为例,真实可行路径是:
Laravel 13.2.0
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
下载
先确认当前 PHP 版本:
;若低于 8.2,必须先升级 PHP(如通过 apt、brew 或 Docker)
修改
中的约束:
→ 改为:
然后运行
,再执行
(需先
)
完成 9→10 后,再把
改成
和
,重复更新 +
每次升级后必须手动验证:检查
是否能进、核心路由是否返回 200、数据库迁移是否正常、队列任务能否 dispatch
最容易被忽略的三处断裂点
这些地方不会报错,但上线后立刻出问题:
的隐式模型绑定变严格:Laravel 10+ 默认只接受整数 ID 匹配主键,
原本返回 404 但被忽略,升级后直接 404,且无日志提示。解决方式不是关 strict,而是统一模型声明
并确保数据库字段类型一致
API 中间件组默认丢失限流:
在 Laravel 10.3+ 中已移除
,所有接口裸奔。必须手动加回或在关键路由显式加
已彻底废弃:部分老代码或自定义响应 trait 还在用,运行时报
。只能全局搜索替换为
,不能靠别名兼容
真正决定升级成败的,从来不是命令行那几行操作,而是你有没有在每个版本间留出足够时间做配置比对、日志观察和流量灰度——尤其当项目用了超过 5 个深度集成的扩展包时,一个
就可能覆盖掉你改了三年的定制化逻辑。
composer updatephp: ^8.2composer updateYour requirements could not be resolved to an installable set of packageslaravel/sanctumlaravel/breezefruitcake/laravel-corsClass not foundapp/Http/Controllersphp -vcomposer.json"laravel/framework": "^9.0",
"php": "^8.0""laravel/framework": "^10.0",
"php": "^8.1"composer updatephp artisan upgradecomposer require laravel-upgradecomposer.json"laravel/framework": "^11.0""php": "^8.2"php artisan upgradephp artisan tinkerRoute::apiResource()/api/posts/abcprotected $keyType = 'string'$middlewareGroups['api']\Illuminate\Routing\Middleware\ThrottleRequests::class . ':api'throttle:60,1Response::json()Call to undefined methodresponse()->json()vendor:publish --force