升级 Laravel 主版本需先修改 composer.json 中 "laravel/framework" 版本约束(如 "^10.0" 改为 "^11.0"),确保 PHP ≥ 8.2 且 Composer ≥ 2.5,再执行 composer update laravel/framework --with-all-dependencies,并避免误用 migrate:fresh。

composer update 升级 Laravel 版本前必须改 composer.json
直接跑 composer update 不会升级 Laravel 主版本,它只按 composer.json 里写的约束拉包。你看到的“升级失败”或“没变化”,八成是 "laravel/framework" 的版本号还卡在 "^10.0" 或更老的范围里。
实操建议:
- 先查当前 Laravel 版本:
php artisan --version - 打开
composer.json,定位到"laravel/framework"行 - 把版本号改成目标版本的稳定范围,比如升到 Laravel 11:改
"^10.0"为"^11.0" - 别写死具体小版本(如
"11.2.0"),否则后续composer update无法自动拉补丁更新
升级 Laravel 11 必须先确认 PHP 和 Composer 兼容性
Laravel 11 要求 PHP ≥ 8.2、Composer ≥ 2.5 —— 很多人卡在这步,报错像 Your requirements could not be resolved 或直接退出,其实不是依赖冲突,是环境不达标。
检查和处理:
- 运行
php -v确认 PHP 版本;若低于 8.2,先升级 PHP(Laravel 官方不支持降级适配) - 运行
composer --version;若低于 2.5,用composer self-update升级 Composer - 注意:某些旧服务器用的是系统自带低版本 Composer,可能需要加
sudo或改用curl -sS https://getcomposer.org/installer | php重装
执行 composer update 时要加 --with-all-dependencies
单纯 composer update laravel/framework 容易出问题:Laravel 主包升级后,symfony/*、nesbot/carbon、doctrine/dbal 这些隐式依赖可能版本不匹配,导致运行时报 Class not found 或方法不存在。
正确做法是:
- 先备份
composer.lock文件(重命名即可,比如composer.lock.bak) - 运行:
composer update laravel/framework --with-all-dependencies - 这个参数强制 Composer 同时更新所有直连/间接依赖,确保它们满足新 Laravel 的
require声明 - 如果中途失败,别反复重试 —— 先删掉
vendor/和composer.lock,再从头来
升级后 php artisan migrate:fresh 不是默认操作
很多人以为升级完就该立刻清库重迁,结果把生产数据全干掉了。Laravel 官方升级指南从不推荐在非开发环境跑 migrate:fresh,它只适用于全新安装或本地沙箱验证。
真实场景该怎么做:
- 先跑
php artisan config:clear、php artisan cache:clear,避免旧配置缓存干扰 - 检查
routes/web.php和app/Providers/下的类,Laravel 11 移除了Route::controller()和部分 Facade 别名 - 数据库迁移用
php artisan migrate(增量),而不是fresh;只有确认代码和迁移逻辑完全兼容新版本后,才考虑是否需要手动调整表结构 - 特别注意:Laravel 11 默认启用
default_string_length配置,如果 MySQL 版本
Breaking Changes 的条目,得一行行对照着看。










