对于这个问题,我用 google 和 stackoverflow(如果可以的话)进行了搜索,但找不到足够简洁的答案:(引用:Laravel 4: when using Config::set to change auth.model then Auth::user() not work,Laravel 5.2 how to use config::set in middleware)
如何在 Laravel 5.2.* 中使用 Config::set()
在运行时成功设置一个变量两次?
这是我尝试实现的示例:
我有两个表 companies
和 users
(他们都使用 JWTAuth 从不同的路由登录)。现在我想在这条路线上获取所有 computers
记录 Route::get('/computers')
现在的问题是我想使用相同的中间件来做到这一点,但是我想确保任何这些用户(即公司或用户)在他们使用之前都经过身份验证可以访问此资源
这是我尝试在我的中间件中使用 Config::set()
的尝试:
//all.auth middleware
public function handle($request, Closure $next)
{
Config::set('auth.providers.users.model', \App\Company::class);
Config::set('jwt.user', \App\Company::class);
//check if the request is for company
if($company = JWTAuth::toUser(($request->has('token')) ? $request->token : $request->bearerToken()))
{
return ['COMPANY' => $company];
}
//Unfortunately its not company, lets try users
Config::set('auth.providers.users.model', \App\User::class);
Config::set('jwt.user', \App\User::class);
if($user = JWTAuth::toUser(($request->has('token')) ? $request->token : $request->bearerToken()))
{
return ['USER' => $user];
}
throw new NotFoundHttpException('Your account could not be found.');
...............
}
现在,我注意到的行为是它成功地将 JWT 将使用的模型更改为 Company
但没有将其更改为 User
以防 token 随请求是针对用户
。
如果有人能提供帮助,我将不胜感激,至少要了解这是否可能。
If there is a need to provide more explanations, I am ready to do that.
最佳答案
多次设置配置值按预期工作。您的代码无法按预期工作的原因是 JWTAuth facade 背后的服务仅在您第一次访问它时使用这两个配置参数的当前值解析一次。稍后更改它不会有任何影响。
为了实现您想要的效果,您需要让 Laravel 的服务容器使用新的配置值重新创建服务。为此,您需要做两件事。
首先,从 facade 中删除已解析的实例,以便下次使用它时,它会从服务容器中获取服务的新实例:
JWTAuth::clearResolvedInstances();
然后从容器中删除服务实例,以便需要使用新的配置值再次创建它:
App::forgetInstance('tymon.jwt.auth');
在设置新配置值后添加这两行,下次使用 JWTAuth facade 时它应该使用新设置。
关于php - 在函数中两次使用 Config::set() 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42251056/