Laravel Shift 升级需严格匹配 PHP/Composer 版本、确保 Git 和 composer.json 合规、人工核对补丁与命令、执行测试及业务验证;Laravel 13 要求 PHP ≥8.3 并移除 8.2 兼容层。

用 Laravel Shift 升级 Laravel 项目,不是点一下就完事——它生成的补丁必须配合 CLI 命令和人工核对才能落地。跳过环境检查或盲目 git apply,大概率会卡在 composer update 或运行时抛出 Your requirements could not be resolved to an installable set of packages.。
确认 PHP 和 Composer 版本是否匹配目标 Laravel 版本
Shift 不校验你的本地环境,但它的补丁依赖底层约束。PHP 版本错,后续全崩:
- Laravel 11 要求
php -v≥ 8.2 —— Apache 的 phpinfo() 不算数,必须 CLI 对齐 - Laravel 13 要求 ≥ 8.3;若你还在用 8.2.x,
composer update必然失败,错误信息就是上面那句包解析失败 -
composer --version必须 ≥ 2.2(Laravel 10+ 强制要求),旧版会静默忽略doctrine/dbal移除等关键约束
提交任务前必须满足的 Git 和 composer.json 条件
Shift 靠读取仓库结构和配置来生成补丁。不满足以下任一条件,补丁质量会大幅下降甚至失效:
- 仓库需为公开,或已在 Shift 后台 Settings → Integrations 中绑定有效的 GitHub/GitLab token
-
composer.json中"laravel/framework"的版本号必须明确,例如"^10.0";不能是"dev-main"或"*" - 不要提前手动改
composer.json—— Shift 会自动处理依赖更新,你先改了反而导致它跳过doctrine/dbal移除、spatie/laravel-ignition替换等关键逻辑 - 任务描述里写清源/目标版本,比如 “from 10.x to 11.0”,避免选错模板生成错误 diff
收到补丁后不能直接 git apply
Shift 发来的不是标准 patch 文件,而是带注释的 diff + 手动操作说明。部分变更根本无法用 diff 表达:
-
php artisan vendor:publish --tag=sanctum-migrations这类命令不会出现在 diff 里,但漏掉会导致迁移表缺失 - 配置项移动(如
config/app.php中的providers数组结构调整)需要你手动剪切粘贴 - 缓存驱动、认证 guard、队列连接等配置项的默认值变化,得对照官方升级指南逐项检查
- 某些弃用方法(如
firstOrCreate的参数顺序调整、assertDeleted的行为变更)需人工搜索代码并替换
升级后必须验证的三个硬性环节
补丁应用完、命令跑完、缓存清空,不代表升级完成。这三个环节漏一个,上线后可能悄无声息地坏掉:
- 运行全部测试:特别是涉及模型关系、HTTP 客户端超时、PostgreSQL schema 配置的测试用例
- 手动触发核心业务路径:登录、下单、文件上传、队列任务消费,观察日志是否有
Undefined array key或Call to undefined method - 检查
storage/logs/laravel.log和php artisan tinker中模型实例化是否正常——Laravel 13 移除了大量 polyfill,老代码里隐式依赖的兼容层可能已消失
最易被忽略的是:Laravel 13 要求 PHP 8.3,且移除了所有为兼容 8.2 而保留的向后兼容代码。如果你的项目里有自定义 polyfill、手动重写的类型判断或基于 class_exists 的兜底逻辑,现在就得直面报错——Shift 不会帮你改这些。


















