Laravel 8 升级至 9 的核心卡点是 PHP ≥ 8.0 和以 Symfony Mailer 替代 SwiftMailer;需确认环境、备份、修改 composer.json、迁移邮件配置、替换字符串辅助函数、适配 Carbon 变更,并验证关键功能。

直接从 Laravel 8 升到 9 不是改个版本号的事,核心卡点在 PHP 8.0+ 和 Symfony Mailer 替换 SwiftMailer。下面按真实升级节奏整理出关键步骤,跳过冗余说明,只留你动手时真正要做的动作。
确认环境与备份
这是不能跳过的前置动作,否则后面出问题很难回滚:
- 本地和测试服务器必须已装 PHP 8.0 或更高(推荐 8.1),运行 php -v 确认;
- 检查扩展是否齐全:php -m | grep -E 'opcache|redis|pdo_mysql|mbstring|xml|ctype|json',缺的要补上;
- 用 Git 创建新分支,比如 git checkout -b upgrade-to-laravel-9;
- 备份数据库和 .env 文件——别只靠 Git,.env 不在版本控制里。
修改 composer.json 并更新依赖
这是升级的主干操作,注意写法细节:
- 打开 composer.json,把所有 "illuminate/*" 包版本改成 "^9.0",包括 "laravel/framework": "^9.0";
- 删掉 "swiftmailer/swiftmailer"(Laravel 9 不再需要它);
- 加上 "symfony/mailgun-mailer": "^6.0" 或其他适配的 Symfony Mailer 扩展(如 Sendmail、SMTP);
- 运行 composer update,不要加 --with-all-dependencies,让它按依赖图自动解析;
- 如果报错卡在某个包,先查它是否支持 Laravel 9,不支持就找替代方案或锁低版本临时过渡。
处理几处必改的代码变更
这些不是可选项,不改会直接报错或发不出邮件:
- 邮件配置迁移:把 config/mail.php 里的 'driver' => 'smtp' 等保持不变,但确认 MAIL_MAILER 环境变量设为 smtp(不是 swift);
- 字符串辅助函数替换:把代码里所有 str_slug()、str_limit() 这类函数,换成 Str::slug()、Str::limit(),并确保引入 use Illuminate\Support\Str;;
- Carbon 升级影响:如果你用了 Carbon::now()->toDateTimeString() 这类写法,留意 Carbon 2 → 3 后部分方法签名有变,建议统一用 now()->toDateTimeString()(Laravel 9 自带封装);
- 缓存驱动默认值变化:新项目默认用 database 缓存,老项目仍走 file,但如果你部署在多实例环境,建议主动在 .env 中设 CACHE_DRIVER=database 并运行 php artisan cache:clear。
验证与收尾
跑通不代表没问题,得盯住几个关键信号:
- 执行 php artisan config:clear && php artisan cache:clear,再试 php artisan tinker 看能否正常进入;
- 手动触发一封测试邮件(比如密码重置),确认日志没报 Symfony\Component\Mailer\Transport 相关错误;
- 访问首页、登录页、后台列表页,重点看 Blade 模板里有没有 @yield 或 @section 渲染异常;
- 如果有自定义 Artisan 命令,运行一遍看参数绑定和输出是否正常;
- 最后提交代码前,检查 routes/web.php 和 app/Providers/AppServiceProvider.php 是否有硬编码的旧路径或类引用。


















