[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 的日文文章这样的文章,所以我写了这篇文章。