不能只改laravel/framework版本号再运行composer update,必须同步更新配套包、检查php(≥8.1)和composer(≥2.2)版本、迁移废弃api(如appserviceprovider::register、$dates属性、类式工厂)、修正配置结构(如logging.php)并清理缓存。

不能只改 laravel/framework 版本号再跑 composer update —— 这样大概率启动失败、中间件静默失效、模型工厂报错,甚至 php artisan serve 直接退出无提示。
确认 PHP 和 Composer 版本是否达标
Laravel 10 强制要求 PHP ≥ 8.1.0,Composer ≥ 2.2.0。不满足就卡在依赖解析阶段,报错类似:Your requirements could not be resolved 或 Root composer.json requires php ^8.1。
- 运行
php -v,若输出是PHP 8.0.30或更低,必须先升级 PHP - 运行
composer --version,若低于2.2.0,执行composer self-update - 检查
php artisan --version确实是Laravel Framework 9.x(不是 8.x 或 10.x) - 别跳过第三方包兼容性检查:比如
laravel/sanctum需 ≥^3.2,doctrine/dbal需 ≥^3.0,否则composer update会回退或中断
修改 composer.json 的所有关键约束项
只改 "laravel/framework": "^9.0" → "laravel/framework": "^10.0" 是最常见错误。Laravel 10 的配套包必须同步更新,否则 AppServiceProvider::register() 被移除、$dates 属性被删等变更会直接导致运行时崩溃。
- 批量替换以下字段(以 Laravel 10 官方 Upgrade Guide 为准):
"laravel/framework": "^10.0""nunomaduro/collision": "^7.0""spatie/laravel-ignition": "^2.0""phpunit/phpunit": "^10.0""laravel/sanctum": "^3.2""doctrine/dbal": "^3.0" - 删掉
"minimum-stability": "dev"这类非稳定设置,改为"minimum-stability": "stable",防止意外装入 alpha/beta 包 - 删除
"phpunit/phpunit"之外的测试相关扩展(如phpunit-speedtrap),它们多数未适配 PHPUnit 10,会阻塞composer update
执行更新并处理常见卡点
命令顺序和参数很关键。用错参数会导致部分子依赖没升、symfony 组件版本错位,进而引发 Class "Symfony\Component\Console\Command" not found 这类“找不到类”错误。
- 先运行
composer update "laravel/framework" "laravel/tinker" "laravel/sail" --with-all-dependencies(只升核心,避免连带污染) - 如果卡在
doctrine/dbal,单独执行composer require doctrine/dbal:^3.0再重试 - 若报
symfony/console兼容问题,手动锁死它:"symfony/console": "^6.2"(对应 Laravel 10 兼容范围),再composer update symfony/console - 永远提交新的
composer.lock—— 它才是下次composer install的唯一依据,composer.json只是“意向书”
升级后必须手动迁移的破坏性变更
Composer 只负责装包,不负责修代码。90% 的启动失败都源于这几处没动:
-
app/Providers/AppServiceProvider.php中的register()方法已废弃,所有绑定逻辑必须移到boot()或服务容器配置文件中 -
config/logging.php的stackchannel 结构重写,不要直接覆盖,要对比官方 v10 版本手动合并新增项(比如channels数组格式变化) - 模型中的
$dates属性完全移除,改用$casts = ['published_at' => 'datetime'] - 模型工厂必须从类式写法(
class PostFactory extends Factory)改为闭包式定义,否则Post::factory()->create()会报错 -
routes/web.php若手动包裹了Route::middleware('web'),Laravel 10 默认已自动包裹,重复应用会导致 session 丢失或 CSRF 失效
这些不是可选项,是 Laravel 10 启动前的硬性前提。漏掉任意一条,php artisan test 或真实请求里才会暴露,光看 composer update 成功没用。











