如何在 Laravel 11+(和 12)中替换 Kernel.php

如果你正在考虑升级到 Laravel 11 或者已经在使用 Laravel 12,那么你可能已经发现一个重要变化:那些熟悉的 App\Http\KernelApp\Console\Kernel 类不见了!

别慌,这不是 Bug,这是 Laravel 团队为了简化框架结构做出的重大改进。现在所有的配置都集中到了 bootstrap/app.php 文件中,让项目结构更加清爽,配置更加直观。

本文将手把手教你如何从老的 Kernel 类迁移到新的配置方式,让你的项目顺利拥抱 Laravel 11+。

中间件配置大变样:从 HTTP Kernel 到 bootstrap/app.php

在老版本的 Laravel 中,我们都习惯了在 App\Http\Kernel 里配置中间件,需要维护三个关键数组:

  • $middleware:全局中间件,每个请求都会执行
  • $middlewareGroups:分组中间件,比如 web 组、api 组等
  • $middlewareAliases:中间件别名,方便在路由中使用

而在 Laravel 11 中,这些配置统统搬家了!现在你需要在 bootstrap/app.php 文件中,通过 withMiddleware() 方法来配置:

php
->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
    ]);
})

控制台命令调度:从 Console Kernel 说再见

还记得以前我们在 App\Console\Kernel 类里写定时任务吗?特别是那个 schedule() 方法和 commands() 方法,简直是老朋友了。

但是现在,Laravel 11 把这些也统一管理了!你的所有定时任务和命令路由现在都写在 routes/console.php 文件里,就像这样:

php
use Illuminate\Console\Scheduling\Schedule;

Schedule::command('inspire')->hourly();

最爽的是,你不需要再手动注册这些命令了!Laravel 会自动从 routes/console.php 文件中加载,只要你在 bootstrap/app.php 中通过 withRouting() 指定了这个文件:

php
->withRouting(
    web: __DIR__.'/../routes/web.php',
    commands: __DIR__.'/../routes/console.php',
    health: '/up',
)

默认情况下,Laravel 会自动注册 app/Console/Commands 目录下的所有命令。如果你想从其他目录注册命令,或者手动指定某些命令,可以在 bootstrap/app.php 中使用 withCommands() 方法:

php
->withCommands([
    __DIR__.'/../app/Domain/Orders/Commands', // 扫描目录
    \App\Domain\Orders\Commands\SendEmails::class, // 或注册特定类
])

当 Artisan 启动的时候,Laravel 会自动解析和注册这些命令,一切都是自动化的!

完整配置示例:你的新 bootstrap/app.php 长这样

说了这么多,让我们来看看一个完整的 bootstrap/app.php 文件是什么样子的:

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 团队帮我们:

  • 减少了样板代码:不用再维护那些冗长的 Kernel 类了
  • 配置更集中:所有引导配置都在一个文件里,一目了然
  • 维护更简单:新手也能快速理解项目的核心配置

如果你还在犹豫要不要升级到 Laravel 11,这个改进绝对是一个加分项。虽然刚开始可能需要适应,但用久了你会发现,这种方式确实更加直观和高效!

JaguarJack
后端开发工程师,前端入门选手,略知相关服务器知识,偏爱❤️ Laravel & Vue
本作品采用《CC 协议》,转载必须注明作者和本文链接