探索 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();
我在这篇文章中只是探讨了中间件,但正如你所见,这与我们以往见过的方法截然不同。我坐在那里摸不着头脑:“我该如何设置自己的中间件?我该如何更改默认设置?” 我不得不研究一下这个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,
]);
}
添加完成后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,
]);
}
我们可以通过调用该函数来删除默认存在的中间件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,
]);
}
我们可以将中间件添加或删除到特定的组,即web
使用appendToGroup()
/prependToGroup()
和removeFromGroup()
函数的组。
function (Middleware $middleware) {
$middleware->appendToGroup('web', \App\Http\Middleware\MyMiddleware::class);
}
如果/当这个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);
}
}
现在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();
就像所有新事物一样,改变并非易事。我对这种改变始终有一个疑问。我们拥有相同的工具和能力,但至少在一开始,理解如何管理这一切会更加困难。
我觉得这项更改需要你对内置中间件有更多隐性了解。这重要吗?可能无关紧要。但在某些情况下,你可能需要移除或替换默认中间件。这需要你真正了解默认的中间件。不仅是全局中间件,还有组和别名中间件。我个人觉得这项更改增加了学习难度。即使我经常会忘记默认的中间件或别名是什么,并且app/Http/Kernel.php
经常引用该文件。
我怀疑缺乏冗长性和较小的文件占用空间是否值得?
您对这一新变化有何看法?
鏂囩珷鏉ユ簮锛�https://dev.to/grantholle/exploring-middleware-in-laravel-11-2e10