Laravel Shift 是辅助升级 Laravel 项目的第三方 SaaS 工具,需先确认 PHP(如 v11 要求 ≥8.2、v13 要求 ≥8.3)和 Composer(≥2.2)版本,再通过合法 Git 仓库提交任务;补丁需结合 CLI 命令与手动检查配置、迁移、缓存及认证逻辑,并最终验证业务功能与测试。

运行前必须确认 PHP 和 Composer 版本
Shift 本身不检查你的本地环境,但它生成的补丁和建议依赖目标 Laravel 版本的底层要求。如果你跳过这步,后续会卡在 composer update 或直接报错退出。
- Laravel 11 要求 PHP ≥ 8.2 —— 运行
php -v确认,别信phpinfo()里 Apache 加载的版本,CLI 必须对齐 - Laravel 13 要求 PHP ≥ 8.3 —— 如果你用的是 8.2.x,Shift 可能成功创建任务,但
composer update一定会失败,错误类似:Your requirements could not be resolved to an installable set of packages. - 确保
composer --version≥ 2.2(Laravel 10+ 所需),旧版 Composer 会静默忽略某些依赖约束
如何提交一个有效的 Shift 升级任务
Shift 的核心价值在于它能读取你的 Git 仓库结构、composer.json、模型定义甚至测试文件,然后生成定制化补丁。但前提是它能“看懂”你的项目。
- 仓库必须是公开的,或你已配置好私有仓库的 GitHub/GitLab 访问 token(在 Shift 后台 Settings → Integrations 中绑定)
-
composer.json中的"laravel/framework"版本号必须明确(如"^10.0"),不能写成"dev-main"或"*",否则 Shift 无法判断当前版本 - 不要提前手动改
composer.json—— Shift 会自动处理依赖更新,你先改了反而会导致冲突或跳过关键修改(比如doctrine/dbal移除逻辑) - 任务描述里填清楚源版本和目标版本(例如 “from 10.x to 11.0”),避免选错模板导致生成错误补丁
收到补丁后不能直接 git apply
Shift 发送的不是标准 patch 文件,而是一组带注释的 diff + 修改说明,且部分变更(如迁移文件发布、配置项移动)无法用 diff 表达。盲目应用会漏掉关键步骤。
- 优先执行它提示的 CLI 命令:比如
php artisan vendor:publish --tag=sanctum-migrations,这类命令不会出现在 diff 里,但 Laravel 11+ 强制要求你手动运行 - 对比它列出的“需要手动检查的文件”,尤其是
config/app.php、app/Providers/AppServiceProvider.php和中间件注册逻辑 —— Shift 不会自动删掉已被移除的registerPolicies()调用,得你亲手删 - Redis 缓存标签相关变更(如
cache:prune-stale-tags调度)必须手动加进App\Console\Kernel,Shift 只提醒,不写入 - 如果用了
laravel/sanctum或laravel/passport,务必去它们各自的升级文档核对 Auth guard 配置变化,Shift 不会重写config/auth.php
最后一步永远是验证,不是 php artisan serve
Shift 能帮你把 80% 的语法和结构问题修掉,但业务逻辑是否断裂、第三方包是否兼容、队列是否还能消费,它无能为力。
- 先跑
composer install --no-dev(生产模式),再php artisan config:clear && php artisan cache:clear—— 缓存没清干净时,Route::get()可能还指向旧控制器 - 用
php artisan migrate:status确认所有迁移已标记为Ran,尤其注意 Sanctum/Passport 的迁移是否真的执行了(Shift 不执行migrate,只发命令) - 重点测登录、授权、API Token 创建、队列任务分发 —— 这些是 Laravel 主版本升级中最容易出兼容性问题的环节
- 如果你的项目有 CI,确保
phpunit版本已按目标 Laravel 版本更新(例如 Laravel 13 要求 PHPUnit ≥ 10.5),否则测试直接 fail
#[Fillable] 属性虽然向后兼容,但一旦你在模型里混用 protected $fillable 和 #[Fillable],Eloquent 就会静默忽略后者——这种细节,Shift 不会警告,只有跑通测试并读源码才能发现。


















