必须先确认PHP版本≥8.1,否则composer update会失败或装出不兼容包,导致artisan命令报错;需用Homebrew安装php@8.2并更新PATH,验证intl等扩展启用,再修改composer.json中laravel/framework为"^10.0"并执行composer update --with-all-dependencies。

必须先确认 PHP 版本 ≥ 8.1,否则 composer update 会失败或装出不兼容的包,后续 artisan 命令直接报错。
检查并升级 PHP 到 8.1+
Mac 上用 Homebrew 安装的 PHP 很可能还是 8.0 或更低——Laravel 10 明确要求 PHP ≥ 8.1,且需启用 intl、mbstring 等扩展。缺 intl 会导致 composer create-project 卡住,升级时也会在依赖解析阶段失败。
- 运行
php -v查看当前版本,低于 8.1 就别继续 - 执行
brew install php@8.2(推荐,Homebrew 自动带全扩展) - 更新 shell 的
PATH,确保新 PHP 在前:echo 'export PATH="/opt/homebrew/bin:$PATH"' >> ~/.zshrc && source ~/.zshrc - 验证扩展:运行
php -m | grep -E 'intl|mbstring|openssl|pdo|tokenizer|xml|ctype|json',缺哪个补哪个(通常只缺intl,而php@8.2已内置)
修改 composer.json 并执行更新
Laravel 升级本质是框架包版本变更,但不能只改 laravel/framework,否则第三方包(如 laravel/sanctum、laravel/tinker)可能因版本错位导致路由不加载、中间件失效等静默问题。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 打开
composer.json,把"laravel/framework": "^9.0"改成"laravel/framework": "^10.0" - 同步更新配套包:比如
"laravel/sanctum": "^3.0"→"laravel/sanctum": "^4.0"(查 Sanctum v4 发布页 确认兼容性) - 删掉
vendor/和composer.lock(可选但推荐,避免 Composer 错误复用旧锁文件) - 运行
composer update --with-all-dependencies,比单纯composer update更彻底,能拉齐子依赖版本
跑迁移前必须处理的 breaking change
Laravel 10 移除了 Illuminate\Support\Facades\Password 的静态 reset 方法,也调整了 APP_URL 的默认行为——如果没改,登录重置密码会 500,队列任务里的 URL 生成可能指向错误域名。
- 搜索项目中所有
Password::reset(…)调用,替换成Password::broker()->reset(…) - 检查
.env中的APP_URL:必须以http://或https://开头,且不能末尾带斜杠(APP_URL=http://localhost:8000✅,APP_URL=localhost:8000❌) - 运行
php artisan config:clear && php artisan cache:clear,否则配置缓存仍用旧逻辑 - 再跑
php artisan migrate,注意 Laravel 10 的迁移命令默认不再回滚失败的迁移(--force才允许),避免误操作破坏数据
常见白屏/404 的真实原因
升级后访问首页空白或 404,大概率不是代码问题,而是 Nginx/Apache 配置或 Valet 状态没跟上。
- 如果你用 Laravel Valet:
valet use php@8.2切换 PHP 版本后,必须valet restart,否则仍走旧 PHP SAPI - 如果你用自配 Nginx:确认
root指向的是public/目录,且try_files $uri $uri/ /index.php?$query_string;这行在location ~ \.php$块之前 - 如果你用
php artisan serve:PHP 8.2+ 默认禁用short_open_tag,检查php.ini是否有short_open_tag = On(Laravel 不依赖它,但自定义 Blade 模板若用了会挂)
最易被忽略的是 APP_URL 格式和 config:clear 这步——很多升级失败其实就卡在这两处,而不是代码逻辑本身。

















