[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

【超过500家企业部署】AWS搭建、运维、监控服务

【超过500家企业部署】AWS搭建、运维、监控服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

[仅适用于 WordPress] 云服务器“Web Speed”

[仅适用于 WordPress] 云服务器“Web Speed”

[便宜]网站安全自动诊断“快速扫描仪”

[便宜]网站安全自动诊断“快速扫描仪”

[预约系统开发] EDISONE定制开发服务

[预约系统开发] EDISONE定制开发服务

[注册100个URL 0日元] 网站监控服务“Appmill”

[注册100个URL 0日元] 网站监控服务“Appmill”

【兼容200多个国家】全球eSIM“超越SIM”

【兼容200多个国家】全球eSIM“超越SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

【全球专属服务】Beyond北美及中国MSP

【全球专属服务】Beyond北美及中国MSP

[YouTube]超越官方频道“美由丸频道”

[YouTube]超越官方频道“美由丸频道”

[Laravel11] 中间件处理过程中 Auth Facade 获取 null 或 false 时该怎么办 [Auth::]

大家好,我是系统开发部的 Enoki。
这次,我们将讨论随着 Laravel 11 的发布,围绕中间件的符号变化。许多 Laravel 用户可能都意识到一个变化,即在添加自制中间件时,现在将其编写在bootstrap/app.php而不是Kernel.php

任意添加的中间件中使用Auth为null或false,并且
存在无法获得预期结果的情况,我想写一个比较。

您想要添加的任意创建的中间件示例

我想添加这样的中间件!这是给那些说的人的。

命名空间 App\Http\Middleware; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Symfony\Component\HttpFoundation\Response; class HogeMiddleware { /** * 处理传入请求。 param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next */ 公共函数句柄(Request $request, Closure $next): Response { $user = Auth::user() ; // 如果您想在用户的特定标志为 false 时重定向特定路由 if ($user->someThingFlag === false) { return redirect()->route('route.something'); $下一个($请求);

(这只是一个示例。请记住,如果用户无法检索它,将会发生错误。)

如何添加中间件:Laravel 10 和 11 之间的差异

在 Laravel 10 中添加任何中间件时,请将其添加到Kernel.php

    /** * 应用程序的路由中间件。 * * 这些中间件可以分配给组或单独使用 * * @var 数组。<string, class-string|string> */ protected $routeMiddleware = [ 'hoge' => \App\Http\Middleware\HogeMiddleware::class, ];

此时,我可以在中间件中使用Auth Facade,没有任何问题。 (自我比较)
(我认为很多时候能够将 Auth 与中间件一起使用会很好。)

所以,在 Laravel 11 中,Kenel.php 对应的部分被改为 app.php,内容发生的情况如下。

return Application::configure(basePath: dirname(__DIR__)) ->withRouting( web: __DIR__.'/../routes/web.php', 命令: __DIR__.'/../routes/console.php', health : '/up', then: function () { Route::middleware([ 'web', HogeMiddleware::class, ]); } ) ->withMiddleware(function (Middleware $middleware) { $middleware->web(prepend : [ HogeMiddleware::class, ]); }) ->withExceptions(function (Exceptions $exceptions) { // })->create();

它看起来像这样。感觉我已经重新训练了自己很多。
老实说,我还是不太习惯。
如果您按原样使用它,即使您使用 Auth 外观,您也将无法获得 null 或 false 信息,或与经过身份验证的用户(或任何内容)相关的任何信息。

解决方案(主题)

这在 Laravel 10 中也很常见,但它是为了设置优先级。
在 Laravel 10 中,默认中间件的分组如下所示。

    protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\ View\Middleware\ShareErrorsFromSession::class、\App\Http\Middleware\VerifyCsrfToken::class、\Illuminate\Routing\Middleware\SubstituteBindings::class、]、...

在 Laravel 10 之前,默认中间件被分组在 $middlewareGroups 中。
另外,任意创建的中间件的执行顺序可以通过设置$middlewarePriority来任意改变。
这个标准中间件执行后,注册的任意创建的中间件也被执行,所以我并没有真正关心它。

我查了一下,发现需要提前执行以下两个中间件,才能使用Auth来访问用户信息。

\Illuminate\Cookie\Middleware\EncryptCookies::class、\Illuminate\Session\Middleware\StartSession::class、

如果在执行这两个之前在中间件中使用Auth,似乎无法按预期检索信息。

为此,从 Laravel 11 开始,可以设置优先级来主动控制中间件的执行顺序。

    ->withMiddleware(function (Middleware $middleware) { $middleware->priority([ \Illuminate\Cookie\Middleware\EncryptCookies::class, \Illuminate\Session\Middleware\StartSession::class, \App\Http\Middleware\HogeMiddleware ::class, ]); $middleware->web(前置: [ HogeMiddleware::class, ]);

Auth 外观现已准备就绪,我们可以检索有关用户的数据。

结束

没有特别的收紧。
说实话,在10版本的时候,我就知道可以控制中间件的执行顺序,但是我并没有主动去控制。
你可以通过阅读官方文档来理解,但是我想看到更多像 Laravel 11 的日文文章这样的文章,所以我写了这篇文章。

如果您觉得这篇文章有帮助,请点赞!
3
加载中...
3 票,平均:1.00 / 13
8
X Facebook 哈特纳书签 口袋
[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

[大阪/横滨] 积极招募基础设施工程师和服务器端工程师!

[大阪/横滨] 积极招募基础设施工程师和服务器端工程师!

写这篇文章的人

关于作者

金针木

我玩各种游戏,包括 FPS、RPG、MMO、制作等等。