跳转到主要内容

前言

本指南讲解如何将 Laravel 10 之前的旧应用结构(拥有 Kernel 类以及多个 Service Provider 的结构)迁移到 Laravel 11 之后的 Slim Application Skeleton。
官方文档并不推荐进行此迁移。
  • Laravel 10 的旧结构在 Laravel 11 之后仍然照常运行。截至包含 Laravel 13 的当前版本,都没有终止支持的计划。
  • 迁移完全是可选的,既不是强制也不是推荐。
  • 如果你没有深入理解新旧结构的差异,强烈建议不要进行迁移。这是面向精通框架内部的开发者的工作。
  • 迁移前务必做好备份,并确保所有测试都能通过。

何时需要迁移

以下情况下可以考虑迁移:
  • 希望让项目符合最新的标准结构,方便新成员对照官方文档
  • 希望与 Laravel 11 之后新建的包或 Starter Kit 保持结构一致
  • 希望减少沿袭自旧结构的配置文件和类,让代码库更简洁

前置条件

本指南假设:
  • Laravel 版本升级已完成laravel/framework ^11.0 及以上)
  • 现有测试全部通过
  • 已理解 Laravel 11 之后的应用结构(参考Laravel 11 之后的应用结构

迁移示例

下面演示如何在保留 Breeze(Blade 栈)的前提下,仅将 Laravel 10 + Breeze 项目的应用结构迁移到新结构。
1

替换 bootstrap/app.php

旧的 bootstrap/app.php 会创建 $app 实例并注册 Kernel。我们将它替换为 Application::configure() 的链式调用。旧(Laravel 10):
新(Laravel 11 以后):
withMiddleware()withExceptions() 的回调是接收下一步将要删除的 Kernel 文件设置的地方。先保持为空,在后续步骤中再补充。
2

删除 HTTP Kernel(app/Http/Kernel.php)

app/Http/Kernel.php 中定义了全局中间件、中间件组以及中间件别名。旧(app/Http/Kernel.php):
Laravel 11 中,上述中间件已作为默认值内置于框架中。如果没有自定义,可以直接删除 app/Http/Kernel.php如果有自定义(添加或移除了自定义中间件),请先将其迁移到 bootstrap/app.phpwithMiddleware() 后再删除。
迁移完成后,删除 app/Http/Kernel.php
在 Laravel 11 中,TrustProxiesEncryptCookiesVerifyCsrfToken 等默认中间件类也可以从 app/Http/Middleware/ 中删除。这些类已内置在框架侧,如果不需要自定义,文件本身也可以不保留。
3

删除 Console Kernel(app/Console/Kernel.php)

app/Console/Kernel.php 负责定义计划任务并自动加载命令。旧(app/Console/Kernel.php):
命令的自动加载在 Laravel 11 以后由框架自动扫描 app/Console/Commands/ 目录,因此不再需要写 $this->load()计划任务的定义可以迁移到 routes/console.phpbootstrap/app.phpwithSchedule()
迁移完成后,删除 app/Console/Kernel.php
请不要删除 app/Console/ 目录内的自定义 Artisan 命令文件。命令文件保持不动,仅删除 Kernel 类文件即可。
4

删除异常处理器(app/Exceptions/Handler.php)

app/Exceptions/Handler.php 负责异常上报与渲染的配置。旧(app/Exceptions/Handler.php):
如果有自定义内容,请先迁移到 bootstrap/app.phpwithExceptions() 再删除。
$dontFlash 添加过自定义字段的话,也可以按相同方式迁移。
迁移完成后,删除 app/Exceptions/Handler.php
5

删除 RouteServiceProvider 并迁移路由注册

app/Providers/RouteServiceProvider.php 负责路由文件的加载与限流的配置。旧(app/Providers/RouteServiceProvider.php):
路由文件的注册迁移到 bootstrap/app.phpwithRouting()
限流迁移到 AppServiceProvider::boot()
如果有地方使用了 HOME 常量,请直接替换成 URL 字符串,或将常量迁移到 AppServiceProvider迁移完成后,删除 app/Providers/RouteServiceProvider.php
6

整理 Service Provider

Laravel 10 默认提供了 5 个 Service Provider。请将它们整合到 AppServiceProvider.php 一个文件中。要删除的 Provider(将内容迁移到 AppServiceProvider 后删除):迁移旧 app/Providers/AuthServiceProvider.php 内容的示例:
删除不再需要的 Provider 文件后,删除 config/app.php 中的 providers 数组。
接着创建 bootstrap/providers.php 以适配新结构。
bootstrap/providers.php 存在时,Laravel 会将其作为 Provider 列表优先加载。
7

更新 Controller 基类

Laravel 10 的 Controller 基类使用了 AuthorizesRequestsValidatesRequests trait。Laravel 11 的新基类是不包含这些 trait 的简单抽象类。旧(Laravel 10):
新(Laravel 11 以后):
trait 提供的功能按以下方式替代:如果现有 Controller 使用了 trait 的方法,可以选择修改每个 Controller,或者在 Controller 基类中保留这些 trait。不必一次性全部改完也能运行。
如果 Breeze 或 Jetstream 生成的认证 Controller 使用了 $this->validate()$this->authorize(),请在修改基类之前务必进行动作验证。
8

删除不需要的 config 文件

config/cors.phpconfig/hashing.phpconfig/view.php 等未从默认值修改的文件可以删除。有修改的文件请保留。
9

更新 public/index.php

由于随新结构做了改动,需要整体重写。
10

更新 artisan

artisan 文件也同样需要全部重写。
11

更新 tests/TestCase.php

由于不再需要 CreatesApplication trait,需要做调整。 tests/CreatesApplication.php 可以删除。
12

更新 .env、.env.example、phpunit.xml

CACHE_DRIVER 变为 CACHE_STORE 等,条目也有增删,如有需要请调整。 这类改动涉及 config 文件和生产环境,请谨慎处理。 不必强行跟进。
13

验证

迁移完成后,按以下顺序进行验证。
遇到问题时,请从备份中恢复被删除的文件并查看错误信息。

迁移后的文件结构

迁移后的项目结构大致如下(展示相对旧结构的变化)。

小结

参考链接

最后修改于 2026年7月18日