[Laravel11] 在中间件处理期间,如果从 Auth Facade 获取到 null 或 false,该怎么办 [Auth::]

大家好,我是系统开发部的Enoki。
这次我想和大家聊聊Laravel 11版本中中间件语法的变化。很多Laravel用户可能已经注意到,现在添加自定义中间件时,需要将其编写在bootstrap/app.php文件而不是Kernel.php

在中间件中随意添加 Auth 时,为 null 或 false,我
无法获得预期的结果,因此我想写一篇关于如何处理此问题的文章,同时比较 Laravel 10 和 Laravel 11。

您想要添加的任何中间件示例

这是为想要添加类似中间件的人们准备的!

namespace App\Http\Middleware; use Closure; 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 */ public function handle(Request $request, Closure $next): Response { $user = Auth::user(); // 如果用户具有特定标志,并且您希望将其重定向到特定路由 if ($user->someThingFlag === false) { return redirect()->route('route.something'); } return $next($request);

(这只是一个示例。如果用户无法检索到该内容,则会发生错误。)

如何添加中间件:Laravel 10 和 11 的区别

在 Laravel 10 中,如果你想添加任何中间件,Kernel.php中的 $routeMiddleware

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

在这种情况下,我能够在中间件中使用身份验证门面,没有任何问题。(根据我的经验)
(我认为很多时候,能够在中间件中使用身份验证都会很方便。)

所以,在 Laravel 11 中,与 Kenel.php 对应的部分已经更改为 app.php,那么它的内容发生了什么变化呢?

return Application::configure(basePath: dirname(__DIR__)) ->withRouting( web: __DIR__.'/../routes/web.php', commands: __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();

它看起来是这样的。感觉我花了不少功夫才搞定。
说实话,我还是不太习惯。
如果我这样用,即使我用了身份验证门面,也会得到 null 或 false,所以我无法获取已认证的用户或任何相关信息(至少我是这么认为的)。

解决方案(主题)

Laravel 10 也存在同样的问题,但它涉及到设置优先级。
在 Laravel 10 中,Laravel 的默认中间件分组如下:

    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(prepend: [ HogeMiddleware::class, ]); })

现在我们的身份验证界面已经准备就绪,我们可以检索有关用户的数据了。

结束

并没有什么特别的结论。
说实话,我知道 Laravel 10 可以控制中间件的执行顺序,但我并没有主动去控制它。
你可以通过阅读官方文档来了解这一点,但我想要用日语写更多关于 Laravel 11 的文章,所以就写了这篇文章。

如果您觉得这篇文章有用,请点击【点赞】!
7
加载中...
7票,平均分:1.00/17
917
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

榎木

我什么游戏都玩,包括第一人称射击游戏、角色扮演游戏、大型多人在线游戏和建造类游戏。