探索 Laravel 11 中的中间件

2025-06-08

探索 Laravel 11 中的中间件

Laravel 11 预计将于 2024 年“第一季度”发布,最早可能在下个月。

我正在启动一个新项目,因为离发布日期很近,所以我想看看新的主要版本会有什么不同。我记得六个月前读过一篇关于 Http 内核即将消失的Laravel 新闻文章,当时我并没有太在意。

当我使用 创建项目时laravel new project --dev,我惊讶地发现项目大小竟然小了很多。令人惊讶的是,我看到的是一个空config文件夹(你可以用 发布配置文件php artisan config:publish)!

果然,Http 内核不存在。那么……该如何添加或更改中间件呢?在 Laravel 11 之前的版本中,Http 内核(位于)是所有中间件app/Http/Kernel.php配置的所在。此外,在 Laravel 11 之前,你通常不会接触。然而,在新版本中,情况已不再如此。bootstrap/app.php

说实话,作为 Laravel v4.2 以来的用户,这确实是一个很大的范式转变。与其说是一个易于阅读的Kernel.php文件,不如说在添加中间件之前,你需要了解很多隐性知识。

新的起点bootstrap/app.php如下:

return Application::configure()
    ->withProviders()
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        // api: __DIR__.'/../routes/api.php',
        commands: __DIR__.'/../routes/console.php',
        // channels: __DIR__.'/../routes/channels.php',
    )
    ->withMiddleware(function (Middleware $middleware) {
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();
Enter fullscreen mode Exit fullscreen mode

我在这篇文章中只是探讨了中间件,但正如你所见,这与我们以往见过的方法截然不同。我坐在那里摸不着头脑:“我该如何设置自己的中间件?我该如何更改默认设置?” 我不得不研究一下这个Illuminate\Foundation\Configuration\Middleware类才能找到答案。

调用Application::configure()将返回 的实例Illuminate\Foundation\Configuration\ApplicationBuilder,然后调用各种函数withProviders()withRouting()函数withMiddleware()。该withMiddleware()函数接受callable

使用样板,我们可以通过调用以下方法添加新的中间件别名alias()

function (Middleware $middleware) {
    $middleware->alias([
        'some_key' => \App\Http\Middleware\MyMiddleware::class,
    ]);
}
Enter fullscreen mode Exit fullscreen mode

添加完成后some_key,我们可以将其分配给各个路由或路由组。如果想为每个请求添加中间件,可以使用append()prepend()函数来添加全局中间件。

function (Middleware $middleware) {
    // Using a string
    $middleware->append(\App\Http\Middleware\MyMiddleware::class);

    // Or adding multiple
    $middleware->append([
        \App\Http\Middleware\MyMiddleware::class,
        \App\Http\Middleware\MyOtherMiddleware::class,
    ]);
}
Enter fullscreen mode Exit fullscreen mode

我们可以通过调用该函数来删除默认存在的中间件remove()

function (Middleware $middleware) {
    // Using a string
    $middleware->remove(\Illuminate\Http\Middleware\ValidatePostSize::class);

    // Or removing multiple default middleware
    $middleware->remove([
        \Illuminate\Http\Middleware\TrustProxies::class,
        \Illuminate\Http\Middleware\HandleCors::class,
    ]);
}
Enter fullscreen mode Exit fullscreen mode

我们可以将中间件添加或删除到特定的组,即web使用appendToGroup()/prependToGroup()removeFromGroup()函数的组。

function (Middleware $middleware) {
    $middleware->appendToGroup('web', \App\Http\Middleware\MyMiddleware::class);
}
Enter fullscreen mode Exit fullscreen mode

如果/当这个bootstrap/app.php文件变得有点混乱(我想它会的),我们可以通过将这些东西移动到可调用的类来清理它。

我在 中创建了一个app/Http名为 的类AppMiddleware.php。由于旧习难改,你可以将其命名为Kernel.php……

<?php

namespace App\Http;

use Illuminate\Foundation\Configuration\Middleware;

class AppMiddleware
{
    public function __invoke(Middleware $middleware)
    {
        $middleware->appendToGroup('web', \App\Http\Middleware\MyMiddleware::class);
    }
}
Enter fullscreen mode Exit fullscreen mode

现在bootstrap/app.php,用我们的可调用类的新实例替换闭包。

return Application::configure()
    ->withProviders()
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        // api: __DIR__.'/../routes/api.php',
        commands: __DIR__.'/../routes/console.php',
        // channels: __DIR__.'/../routes/channels.php',
    )
    ->withMiddleware(new \App\Http\AppMiddleware())
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();
Enter fullscreen mode Exit fullscreen mode

就像所有新事物一样,改变并非易事。我对这种改变始终有一个疑问。我们拥有相同的工具和能力,但至少在一开始,理解如何管理这一切会更加困难。

我觉得这项更改需要你对内置中间件有更多隐性了解。这重要吗?可能无关紧要。但在某些情况下,你可能需要移除或替换默认中间件。这需要你真正了解默认的中间件。不仅是全局中间件,还有组和别名中间件。我个人觉得这项更改增加了学习难度。即使我经常会忘记默认的中间件或别名是什么,并且app/Http/Kernel.php经常引用该文件。

我怀疑缺乏冗长性和较小的文件占用空间是否值得?

您对这一新变化有何看法?

鏂囩珷鏉ユ簮锛�https://dev.to/grantholle/exploring-middleware-in-laravel-11-2e10
PREV
如何为 Edge 或 Chrome 制作扩展程序
NEXT
在 dev.to 编辑器中更快地编写 - 添加所见即所得和键盘快捷键![技巧 2]