如果你正在考虑升级到 Laravel 11 或者已经在使用 Laravel 12,那么你可能已经发现一个重要变化:那些熟悉的 App\Http\Kernel
和 App\Console\Kernel
类不见了!
别慌,这不是 Bug,这是 Laravel 团队为了简化框架结构做出的重大改进。现在所有的配置都集中到了 bootstrap/app.php
文件中,让项目结构更加清爽,配置更加直观。
本文将手把手教你如何从老的 Kernel 类迁移到新的配置方式,让你的项目顺利拥抱 Laravel 11+。
在老版本的 Laravel 中,我们都习惯了在 App\Http\Kernel
里配置中间件,需要维护三个关键数组:
$middleware
:全局中间件,每个请求都会执行$middlewareGroups
:分组中间件,比如 web 组、api 组等$middlewareAliases
:中间件别名,方便在路由中使用而在 Laravel 11 中,这些配置统统搬家了!现在你需要在 bootstrap/app.php
文件中,通过 withMiddleware()
方法来配置:
->withMiddleware(function (Middleware $middleware) {
// 全局中间件
$middleware->append(EnsureTokenIsValid::class);
// 中间件组
$middleware->appendToGroup('group-name', [
First::class,
Second::class,
]);
$middleware->prependToGroup('group-name', [
First::class,
Second::class,
]);
// 中间件别名
$middleware->alias([
'subscribed' => EnsureUserIsSubscribed::class
]);
})
还记得以前我们在 App\Console\Kernel
类里写定时任务吗?特别是那个 schedule()
方法和 commands()
方法,简直是老朋友了。
但是现在,Laravel 11 把这些也统一管理了!你的所有定时任务和命令路由现在都写在 routes/console.php
文件里,就像这样:
use Illuminate\Console\Scheduling\Schedule;
Schedule::command('inspire')->hourly();
最爽的是,你不需要再手动注册这些命令了!Laravel 会自动从 routes/console.php
文件中加载,只要你在 bootstrap/app.php
中通过 withRouting()
指定了这个文件:
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
默认情况下,Laravel 会自动注册 app/Console/Commands
目录下的所有命令。如果你想从其他目录注册命令,或者手动指定某些命令,可以在 bootstrap/app.php
中使用 withCommands()
方法:
->withCommands([
__DIR__.'/../app/Domain/Orders/Commands', // 扫描目录
\App\Domain\Orders\Commands\SendEmails::class, // 或注册特定类
])
当 Artisan 启动的时候,Laravel 会自动解析和注册这些命令,一切都是自动化的!
说了这么多,让我们来看看一个完整的 bootstrap/app.php
文件是什么样子的:
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
// 在这里配置你的中间件(参考上面的详细示例)
})
->withCommands([
// __DIR__.'/../app/Domain/Orders/Commands',
// \App\Console\Commands\Inspire::class,
])
->withExceptions(function (Exceptions $exceptions) {
// 在这里处理异常
})
->create();
Laravel 11 的这次改动看似颠覆,实际上是一次很棒的简化升级。通过把所有 Kernel 相关的配置都集中到 bootstrap/app.php
中,Laravel 团队帮我们:
如果你还在犹豫要不要升级到 Laravel 11,这个改进绝对是一个加分项。虽然刚开始可能需要适应,但用久了你会发现,这种方式确实更加直观和高效!