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

大家好,我是系统开发部的Enoki。
今天,我想和大家聊聊Laravel 11版本中中间件语法的变化。很多Laravel用户Kernel.php文件而不是bootstrap/app.php文件可能已经注意到,现在需要将自定义中间件添加到
在随意添加的中间件中使用身份验证会导致返回 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`需要将其添加到
/** * 应用程序的路由中间件。 * * 这些中间件可以分配给多个组,也可以单独使用。 * * @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 中也包含了这项功能,它涉及设置优先级。
在版本 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
