Laravel 的这个Kernel.php文件到底是干什么的?



namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        // \App\Http\Middleware\TrustHosts::class,
        \App\Http\Middleware\TrustProxies::class,
        \Fruitcake\Cors\HandleCors::class,
        \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

    /**
     * The application's route middleware groups.
     *
     * @var array>
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'admin.auth' => \Modules\Admin\Http\Middleware\RedirectIfNotAdmin::class, // 添加这行
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    ];
}

一、为什么需要这个页面?

想象一下,学校里有很多“规则”要遵守:

  • 进校门要测体温(安全检查)
  • 上课不能随便说话(行为约束)
  • 只有老师才能进教师办公室(权限控制)

Laravel的这个Kernel.php文件就像是学校的“规则手册”,它规定了:

  1. 所有人都要遵守的规则(全局中间件)
  2. 不同场所的特殊规则(中间件组,比如教室规则、图书馆规则)
  3. 针对特定人的规则(路由中间件,比如“只有班长才能收作业”)
二、它的存在意义是什么?(用“快递包裹”打比方)

当你在网上买了一个包裹,这个包裹在送到你手上之前,要经过很多“检查站”:

  1. 仓库打包(添加保护措施)
  2. 快递站安检(检查危险物品)
  3. 小区门卫(验证身份)
  4. 最后才送到你家

Laravel的中间件就像是这些“检查站”:

  • 全局中间件:每个请求都必须通过的“总检查站”(比如检查是不是合法请求)
  • 中间件组:不同类型的请求走不同的通道(比如网页请求走“web”通道,API请求走“api”通道)
  • 路由中间件:特定请求的“专属检查站”(比如“必须登录才能查看个人信息”)
三、底层是怎么实现的?(用“接力赛”打比方)

想象一场接力赛,中间件就像是接力赛中的“检查员”

  1. 发令枪响(用户发送请求)
  2. 第一棒选手出发(请求进入Laravel)
  3. 第一个检查员(全局中间件):检查选手有没有带违禁物品
  4. 第二个检查员(中间件组):根据选手的目的地(网页/API),分配不同的跑道
  5. 第三个检查员(路由中间件):检查选手有没有资格进入特定区域(比如“只有VIP选手才能进VIP区”)
  6. 选手到达终点(请求被路由到对应的控制器)
  7. 返回的路上(响应返回):每个检查员再次检查(比如给包裹加上封条)

Laravel的中间件就是按照这个顺序,一个接一个地处理请求和响应,确保所有规则都被遵守。

四、代码里的具体例子(用“班级规则”对应)
// 所有人都要遵守的规则(全局中间件)
protected $middleware = [
    \App\Http\Middleware\TrustProxies::class, // 信任代理服务器(就像信任学校保安)
    \Fruitcake\Cors\HandleCors::class, // 处理跨域请求(就像允许校外人员来参观)
    \App\Http\Middleware\TrimStrings::class, // 清理多余空格(就像整理书包)
];

// 不同场所的规则(中间件组)
'web' => [ // 网页请求的规则
    \App\Http\Middleware\EncryptCookies::class, // 给饼干加密(保护小秘密)
    \Illuminate\Session\Middleware\StartSession::class, // 开启会话(就像签到)
    \App\Http\Middleware\VerifyCsrfToken::class, // 验证CSRF令牌(防止坏人冒充你)
],

'api' => [ // API请求的规则
    'throttle:api', // 限制请求频率(就像限制提问次数)
];

// 针对特定人的规则(路由中间件)
'auth' => \App\Http\Middleware\Authenticate::class, // 必须登录(就像要有学生证)
'admin.auth' => \Modules\Admin\Http\Middleware\RedirectIfNotAdmin::class, // 必须是管理员(就像校长才能进校长办公室)
五、一句话总结

Laravel的中间件就像是数字世界的“规则警察”,它们站在请求和响应的“十字路口”,确保每个请求都遵守规则,每个响应都安全可靠。就像学校需要规则来维持秩序一样,Laravel需要中间件来保证应用的安全和稳定!

你可能感兴趣的:(Laravel,php,laravel,开发语言)