可直接迁移但必须严格按 Laravel 9.x→10.x 路径执行,涉及环境(PHP≥8.1、Composer≥2.2、确认为9.x)、依赖与路由(改用显式控制器数组语法)、数据库(避免change()破坏外键,改用三步法)、缓存(清四类缓存并重测)。

可以直接迁移,但必须严格按 Laravel 9.x → 10.x 路径执行,不能跳过中间版本。整个过程不是改个版本号就行,涉及环境、依赖、语法、缓存四类关键调整。
确认基础环境达标
升级前必须验证三项硬性条件,任一不满足都会导致 composer update 失败或运行异常:
- 运行 php -v 确认 PHP ≥ 8.1.0 —— Laravel 10 不兼容 8.0 及更低版本,报错提示通常是 Your requirements could not be resolved
- 运行 composer --version 确认 Composer ≥ 2.2.0 —— 旧版无法正确解析 Laravel 10 的依赖约束
- 运行 php artisan --version 或查看 composer.json,确保当前确实是 9.x(如 9.52.15),而非 8.x 或更早;若是 8.x,需先升至 9.x
更新依赖与路由写法
Laravel 10 废除了隐式控制器命名空间绑定,所有路由必须显式声明控制器类名,否则会报 Class not found 错误:
- 将 routes/web.php 和 api.php 中类似
'HomeController@index'的字符串写法,全部替换为数组语法:[App\Http\Controllers\HomeController::class, 'index'] - 在文件顶部添加 use 语句简化引用,例如
use App\Http\Controllers\HomeController;,之后可简写为[HomeController::class, 'index'] - 同步检查资源路由(
Route::resource())、中间件组内路由及任何自定义路由文件,确保无遗漏
处理数据库迁移与外键风险
Doctrine DBAL 升级到 v3+ 后,change() 方法在修改含外键字段时会重建表结构,导致外键丢失(数据仍在,但约束消失):
- 避免对带外键的字段直接调用
->change(),例如$table->string('email', 191)->change() - 改用三步安全法:先
dropForeign(),再change(),最后foreign()重建(注意字段类型、符号等必须完全一致) - 开发环境建议启用
DB_FOREIGN_KEYS=true,并在迁移开头加Schema::enableForeignKeyConstraints();,提前暴露问题
清理缓存并验证配置
旧缓存会与 Laravel 10 新配置结构冲突,引发白屏、日志崩溃甚至整个应用不可用:
- 执行四类清除命令:
php artisan config:clear、php artisan cache:clear、php artisan view:clear、php artisan route:clear - 特别注意
config/logging.php结构已重写,若只清了 view 或 route 缓存而漏掉 config,仍可能报错 - 升级后务必运行测试套件(
vendor/bin/phpunit),重点检查中间件顺序、表单验证、队列 job 序列化等易出问题模块


















