【发布时间】:2020-01-03 18:45:31
【问题描述】:
我有一个 Laravel 版本 6 应用程序。我使用JWT package 进行身份验证。
这样定义的路由:
// route/api.php
Route::middleware('auth:api')->group(function () {
Route::apiResources([
'genders' => 'API\GenderController'
]);
});
在控制器内部,我有 5 个函数 index、store、show、update 和 destroy。
在这些函数中运行任何代码之前,我需要为当前用户设置语言环境,如下所示:
public function index()
{
$locale = request()->user()->lang;
app()->setLocale($locale);
// Rest of the function
}
我的控制器类扩展了BaseController 类。由于 Restful API 是无状态的,我需要在每次用户发送 API 请求时设置语言环境。现在的问题是,哪里是最好的地方,我该怎么做?
我尝试在 BaseController 的构造函数中执行此操作,但似乎 middleware('auth:api') 尚未检查构造函数中的令牌。
另一个选项是在身份验证事件处理程序中设置语言环境。我找到了一个 JWT 包事件列表here:
// fired when the token could not be found in the request
Event::listen('tymon.jwt.absent');
// fired when the token has expired
Event::listen('tymon.jwt.expired');
// fired when the token is found to be invalid
Event::listen('tymon.jwt.invalid');
// fired if the user could not be found (shouldn't really happen)
Event::listen('tymon.jwt.user_not_found');
// fired when the token is valid (User is passed along with event)
Event::listen('tymon.jwt.valid');
如果有人可以帮助我为tymon.jwt.valid 定义一个处理程序,我将不胜感激。或者即使您有其他解决方案可以在执行index、store、show、update 和destroy 函数之前运行事件。
【问题讨论】:
-
中间件有什么问题?
-
中间件没有问题。只是在创建目标类的实例后检查令牌。如果我在
index函数中运行代码,则用户可以访问,因为检查已经完成。但是,如果我在构造函数中执行此操作,则用户为 null 并且它显示令牌尚未检查。