必须先将PHP版本升至^8.2并更新composer.json中的php约束,再执行composer update laravel/framework laravel/octane --with-all-dependencies,同步替换bootstrap/app.php、删除config/app.php中的providers/aliases数组、更新Blade插槽语法,并在生产环境启用OPcache及补全路由名称后缓存。

你正在维护一个 Laravel 10 应用,需要升级到 Laravel 11 并确保本地开发和生产环境都稳定运行。升级不是简单执行一条命令,必须同步处理 PHP 版本、配置变更、废弃功能移除和部署适配。
升级前的强制检查
打开项目根目录下的 composer.json,确认 PHP 版本约束已更新为 ^8.2;若仍为 "php": "^8.1",Laravel 11 安装会失败并中断整个流程。
运行 php -v 检查当前 PHP 版本,低于 8.2 的必须先升级系统 PHP 或切换至新版 Docker 镜像,否则后续所有步骤都会报错。
备份数据库并导出当前 .env 文件——Laravel 11 移除了 APP_URL 的自动补全逻辑,生产环境 URL 错误将导致混合内容警告或前端资源加载失败。
本地开发环境升级
方法一:一步到位升级(推荐)
执行:composer update laravel/framework laravel/octane --with-all-dependencies。该命令强制更新核心框架及依赖链,避免因中间包版本不兼容导致的 Facade not found 报错。
方法二:分阶段升级(适合大型项目)
① 先升级 Laravel 核心:composer require laravel/framework:^11.0 --update-with-dependencies
② 再单独升级 Octane(如使用):composer require laravel/octane:^3.0
③ 最后清理缓存:php artisan config:clear && php artisan view:clear
升级后必须运行 php artisan storage:link——Laravel 11 默认启用 APP_URL 严格校验,未执行此命令会导致 Storage::url() 返回空字符串,图片资源全部 404。
关键配置迁移
复制 vendor/laravel/framework/src/Illuminate/Foundation/Configuration 下的 bootstrap/app.php 到项目根目录,替换原有引导文件。旧版 bootstrap/app.php 中的手动服务提供者注册方式已被废弃,继续使用将触发 Class 'App\Providers\AppServiceProvider' not found。
删除 config/app.php 中的 'providers' 和 'aliases' 数组——Laravel 11 采用自动发现机制,手动声明不仅无效,还会干扰服务容器初始化顺序。
将 resources/views 下所有 Blade 模板中的 @yield('content') 替换为 <x-slot name="slot"></x-slot>——这是 Laravel 11 中 Blade 组件插槽语法的强制变更,不改将导致视图渲染空白。
生产环境部署适配
在服务器上,进入项目目录后执行:git pull && composer install --no-dev --optimize-autoloader。注意:Laravel 11 的 --optimize-autoloader 会生成更紧凑的 autoloader,但若服务器 PHP 扩展缺失(如 mbstring),该命令会静默失败并卡住进程。
修改 .env 文件:APP_ENV=productionAPP_DEBUG=falseOPCACHE_ENABLE=1
【OPCACHE_ENABLE 必须显式设为 1】——Laravel 11 默认禁用 OPcache,不开启将导致路由解析速度下降 40% 以上。
执行缓存预热:php artisan config:cache && php artisan route:cache && php artisan view:cache。其中 route:cache 在 Laravel 11 中改为仅缓存命名路由,若项目中大量使用 Route::get('/path', ...) 无名称路由,缓存后将无法匹配,必须先补全 ->name('xxx')。
重启 Web 服务:
Nginx 用户执行:sudo nginx -t && sudo systemctl reload nginx
Apache 用户执行:sudo apachectl graceful


















