能升,但必须从 laravel 9.x(或 8.x)逐步升级,不能跳过9直接从8升10;php版本至少要8.1.0,否则composer update会失败。

能升,但必须从 Laravel 9.x(或 8.x)逐步升级,不能跳过 9 直接从 8 升 10;PHP 版本至少要 8.1.0,否则 composer update 会直接失败。
检查当前环境是否达标
升级不是改个版本号就完事,Laravel 10 对底层有硬性要求:
- 运行
php -v确认 PHP ≥8.1.0—— 如果是 8.0 或更低,composer update会报错:Your requirements could not be resolved - 运行
composer --version确认 Composer ≥2.2.0—— 旧版 Composer 可能无法解析 Laravel 10 的依赖约束 - 执行
php artisan --version查看当前 Laravel 版本,确认是9.x(或 8.x)。若已是 10.x,无需升级 - 检查关键第三方包是否兼容:比如
laravel/sanctum要 ≥^3.2,doctrine/dbal要 ≥^3.0,否则composer update会卡住或降级失败
修改 composer.json 并更新依赖
这一步看似简单,但写错一个字符就可能拉不下来包,或引入不兼容的子依赖:
- 把
"laravel/framework": "^9.0"改成"laravel/framework": "^10.0" - 同步更新配套包:
"nunomaduro/collision": "^7.0"、"spatie/laravel-ignition": "^2.0"、"phpunit/phpunit": "^10.0" - 删掉
"minimum-stability": "dev"这类非稳定设置,改成"minimum-stability": "stable",否则可能意外装入 alpha/beta 版本 - 执行
composer update --with-all-dependencies(推荐加--with-all-dependencies,避免部分包被跳过导致隐性冲突)
处理常见破坏性变更(Breaking Changes)
升级后跑不起来?大概率是这些地方没动:
-
$dates属性在模型中已被完全移除 —— 如果你还在用它做日期自动转换,得改用$casts = ['published_at' => 'datetime'] -
URL::to()不再推荐用于生成资源链接,应改用asset()或route();Request::segment()替代了部分URL::的路径判断逻辑 - 配置文件
config/logging.php结构重写,不要直接覆盖,而是对比官方 v10 版本手动合并新增项(比如stackchannel 的channels数组格式变化) - 模型工厂语法从类式写法(
class PostFactory extends Factory)强制改为闭包式:Post::factory()->count(3)->create()依然可用,但定义方式必须重构
验证与收尾:别跳过 php artisan test 和缓存清理
很多问题只在真实请求或测试中暴露,光看 composer update 成功没用:
- 先跑一遍测试:
php artisan test—— 尤其关注中间件注册、认证 guard 切换、邮件 stub 路径是否还存在(Laravel 10 默认不再自带resources/views/vendor/mail) - 清空所有缓存:
php artisan config:clear、php artisan cache:clear、php artisan view:clear,否则旧配置可能被缓存住,导致行为诡异 - 如果用了自定义公共路径(比如通过
$app->bind('path.public', ...)),得换成app()->usePublicPath(__DIR__.'/public'),否则静态资源 404 - 最后检查
.env中的APP_KEY是否仍有效 —— Laravel 10 不再自动重生成,如果升级后登录态全丢,先怀疑这个
最常被忽略的是配置文件合并和工厂语法迁移,这两处没改,应用可能启动成功但某条路由或某个数据创建直接报错,而且错误提示不直观。动手前务必打开 Laravel 官方《Upgrade Guide: 10.x》页面,Ctrl+F 搜关键词,比凭记忆靠谱得多。











