中间件优先级在 Laravel 5.5 中不起作用



我被困在我很确定的东西上,我很确定这是非常基本的......但不知何故我无法让它工作。

我创建了一个中间件来根据用户的选择设置我网站的区域设置(他的选择在数据库中的"locale"列下注册)。我所做的是检查用户是否已登录,如果他是,我使用他的语言环境,如果不是,我默认为英语。

出于某种原因,我的中间件永远不会"看到"用户登录,并且始终默认为英语。我已经将 Auth::check() 的结果输出到日志中,实际上这总是返回 false,即使用户实际上已登录。

我想这与在身份验证之前执行的这个中间件有关。我试图更改内核文件中的优先级,但这仍然不起作用。知道吗?

我的中间件

namespace AppHttpMiddleware;
use Closure;
use IlluminateSupportFacadesAuth;
class SetLocale {
public function handle($request, Closure $next) {
if(Auth::check()) {
$locale = Auth::user()->locale;
} else {
$locale = 'en';
}
App::setLocale($locale);
return $next($request);
}
}

我的路由("auth"是默认的身份验证中间件,"checkProjectPermission:read"检查登录的用户是否有权访问此项目)

Route::prefix('client')->middleware(['auth','checkRoomPermission:read'])->group(function() {
Route::get('{project_id}/checklist', 'ProjectController@accessChecklist')->name('checklist');
}

我的内核.php文件 :

protected $middleware = [
IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,
IlluminateFoundationHttpMiddlewareValidatePostSize::class,
AppHttpMiddlewareTrimStrings::class,
IlluminateFoundationHttpMiddlewareConvertEmptyStringsToNull::class,
AppHttpMiddlewareTrustProxies::class,
AppHttpMiddlewareSetLocale::class
];
protected $middlewarePriority = [
IlluminateSessionMiddlewareStartSession::class,
IlluminateViewMiddlewareShareErrorsFromSession::class,
IlluminateAuthMiddlewareAuthenticate::class,
IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
IlluminateSessionMiddlewareAuthenticateSession::class,
IlluminateRoutingMiddlewareSubstituteBindings::class,
IlluminateAuthMiddlewareAuthorize::class,
AppHttpMiddlewareSetLocale::class
];

谢谢

问题是您要将SetLocale添加到全局中间件中。global中间件不会start a session,因此您无权访问基于会话的数据 - 例如用户。

如果你看一下 laravel 提供的web中间件(为简洁起见进行了清理)

protected $middlewareGroups = [
'web' => [
EncryptCookies::class,
AddQueuedCookiesToResponse::class,
CreateFreshApiToken::class,
StartSession::class,
ShareErrorsFromSession::class,
VerifyCsrfToken::class,
SubstituteBindings::class
]
]

您将看到为什么添加到中间件的任何中间件都可以访问authweb类,因为它注入了StartSession

如果要访问基于会话的数据,则需要确保StartSession已启动。

不要只是将StartSession添加到您的全局中间件中,否则您将度过一段糟糕的时光。相反,请将其添加到auth中间件中,并在StartSession之后添加SetLocale

编辑

请注意,如果您使用的是Web Middleware则还必须向该Middleware Group添加SetLocale

优先级只是一个nsort,它根据middlewarePriority数组中中间件的存在对应用于当前请求的middleware进行重新排序。

简化:如果中间件不在路由请求的中间件组中,则中间件优先级没有任何意义。

最新更新