Laravel 6 升级到 Laravel 8 不能跳版本,必须先升到 7 再升到 8;因官方不支持跨主版本升级,跳步会导致依赖冲突、工厂模式断裂、命名空间变更、PHP 版本硬性不兼容及废弃 API 移除等实质性破坏。

直接说结论:Laravel 6 LTS 升级到 Laravel 8 不能跳版本,必须先升到 7,再升到 8;中间涉及工厂重构、PHP 版本硬性要求(Laravel 8 需 PHP 7.3+)、废弃 API 移除(如 $dates、Arr::random())、以及默认命名空间变更等实质性破坏点。
为什么不能从 Laravel 6 直接升到 8
Laravel 官方不支持跨主版本升级,6 → 8 跳过 7 会导致大量未声明的兼容性断裂:
-
composer require laravel/framework:^8.0会因依赖冲突失败(例如illuminate/supportv6 和 v8 的Str类方法签名已变) - Laravel 7 是工厂模式过渡版本,同时支持旧式闭包工厂和新式类工厂;Laravel 8 则完全移除
$factory->define()全局对象,强制使用类式工厂 - Laravel 6 使用
App\为模型默认命名空间;Laravel 8 推荐并默认适配App\Models\,且config/auth.php中的'model'配置项若仍写App\User::class会报错 - PHP 版本要求跃升:Laravel 6 支持 PHP 7.2+,而 Laravel 8 要求 PHP 7.3+(实际建议 7.4+),CentOS 7 默认 PHP 7.2 必须先升级系统 PHP 或用 SCL
逐版本升级的关键操作节点
以 Git 分支方式操作(例:从 release/6.x 拉出 upgrade/7.x,验证通过后再拉 upgrade/8.x):
- 升 6 → 7 前,运行
php artisan preset none清除已废弃的 Vue 脚手架残留(Laravel 7 开始移除php artisan preset命令) - 升 7 → 8 前,必须安装
doctrine/dbal(否则php artisan make:migration修改字段会报错),执行composer require doctrine/dbal - 升 7 → 8 时,
composer.json中所有illuminate/*包需统一与laravel/framework主版本对齐,避免混用 v7 和 v8 组件(如illuminate/busv7 +laravel/frameworkv8 会触发 trait 冲突) - 每次升级后立即运行
php artisan clear-compiled && php artisan optimize:clear,防止旧版编译缓存干扰
工厂代码迁移必须手动处理
Laravel 8 彻底弃用 $factory->define(),所有 database/factories/*.php 文件必须重构成类:
- 旧写法(Laravel 6/7):
$factory->define(User::class, function (Faker $faker) { return ['name' => $faker->name]; }); - 新写法(Laravel 8):新建
database/factories/UserFactory.php,内容为:namespace Database\Factories; use App\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; class UserFactory extends Factory { protected $model = User::class; public function definition() { return ['name' => $faker->name]; } } - 若项目中存在工厂关联调用(如
'user_id' => factory(User::class)->create()->id),需全部改为'user_id' => User::factory()->create()->id - 第三方包(如
laravel/sanctum)若含工厂文件,需确认其是否已适配 Laravel 8 类式工厂;未适配则需临时 fork 并 patch,或锁定该包旧版本
容易被忽略的配置与路径陷阱
升级完成后跑 php artisan tinker 可能立刻暴露问题:
-
config/auth.php中'providers.users.model'必须从App\User::class改为App\Models\User::class(即使你没迁模型目录,Laravel 8 的默认认证 scaffolding 已生成在App\Models) -
app/Providers/AppServiceProvider.php中若手动绑定了Illuminate\Contracts\Logging\Log等接口,需检查绑定实现类是否已被 Laravel 8 移除(如Monolog\Logger替代方案变更) - 前端资源编译:Laravel 6 默认用 Webpack 4 + Laravel Mix 5,Laravel 8 推荐 Webpack 5 + Mix 6,
npm install后若npm run dev报错,先删node_modules和package-lock.json再重装 - 日志驱动变更:Laravel 8 默认
LOG_CHANNEL=stack,若原项目直连single,需同步更新config/logging.php中'default'键值,否则Log::info()不落盘
最常卡住的地方不是命令执行失败,而是升级后部分请求返回 500 却无日志——因为 storage/logs/laravel.log 权限被旧版 php-fpm 用户写入过,新 PHP 进程无法追加。务必在升级后执行 chmod -R 775 storage bootstrap/cache 并 chown -R www-data:www-data storage bootstrap/cache(用户组依实际环境调整)。


















