2017-02-15 59 views
2

我對這個問題已經用google和stackoverflow(如果可能的話),並且找不到足夠的答案:(一些ref: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在函數中使用Config :: set()兩次的方法

如何在運行時用Laravel 5.2中的Config::set()成功設置變量兩次。

這裏是什麼,我想實現一個例子:

我有兩個表companiesusers(它們都從不同的路線與登錄JWTAuth)。現在,我想在這個單一路線Route::get('/computers')

現在這個問題必須獲取所有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的情況下,並未將其更改爲User

我將不勝感激,如果有人能夠幫助,至少理解這是否可能。

如果需要提供更多解釋,我已準備好做到這一點。

回答

1

多次設置配置值按預期工作。您的代碼無法正常工作的原因是您使用當前2個配置參數的值,僅在您第一次訪問它時一次性解析了門面背後的服務。稍後改變它不會有任何影響。

爲了達到您想要的效果,您需要使Laravel的服務容器重新創建具有新配置值的服務。要做到這一點,你需要做2件事。

首先,從門面刪除解決實例,以便在下次使用時,它從服務容器獲取該服務的新實例:

JWTAuth::clearResolvedInstances(); 

然後從容器中取出的服務實例,以便它需要用新的配置價值再次發佈:

App::forgetInstance('tymon.jwt.auth'); 

添加那些2線後,您將使用JWTAuth門面它應該使用TNE新設置的新配置值和下一次。

+1

謝謝@ jedrzej.kurylo。我會嘗試並提供反饋。 –

+0

謝謝我嘗試了這兩行,但結果仍然是一樣的。有什麼我可能會在這裏失蹤?我注意到我會在問題中更新一些其他行爲。 –

1

對於我目前可以理解的,您在代碼中第二次調用JWTAuth Facade時,它自己的實例已經存在於服務容器中。

JWTAuth不必構造也不需要其他時間,所以它使用在第一次調用它時使用配置構造的舊實例。

Config :: set()兩次工作,但JWTAuth實例總是相同的(第一個),所以我認爲你必須在第二次調用Facade之前銷燬JWTAuth實例。

希望這會有所幫助。

+0

感謝@dparoli,你能幫助給出一個如何摧毀這個實例的例子嗎? –

+0

我認爲@ jedrzej.kurylo的答案是最完整的:他發佈的代碼應該可以工作。 – dparoli