2016-08-18 45 views
0

用戶可以屬於多個俱樂部,所以當他們登錄我想這種關係,並在Auth::user()緩存起來,這樣我可以檢查整個應用程序,而不必相互撞擊數據庫時間。Laravel自定義驗證:獲取用戶關係

我一直在研究這個,但真的不能找到任何信息。我來最接近的是一個自定義的authenticated()方法添加到Http\Controllers\Auth\AuthController的建議。我做了,但它沒有給我任何東西。

protected function authenticated(Request $request, $user) 
{ 
    $user->load('memberships'); 
} 

有人可以給我一些關於如何解決這個問題的指針嗎?

回答

1

一個非常簡單的方法是將監聽'Illuminate\Auth\Events\Login'事件,火災時,請查看是否在俱樂部的會議。如果不是,請查詢數據庫並將它們添加到會話中,然後從會話中返回它們。

雖然它們在技術上沒有連接到這將由Auth::user()返回的User模型,效果是一樣的,你剛剛從會議通過session('clubs')抓住他們。

從技術上說,你想緩存某些東西到模型上並將其存儲在緩存中並不合理,因爲緩存在所有用戶中都是相同的,所以會議將是正確的地方。

+0

好笑的是,我本來在看活動,並有利於驗證的駁回。你的建議簡單而優雅,像魅力一樣工作。謝謝! – timgavin

0

解決方案:重寫postLogin()AuthenticatesUsers特質所以你可以自由地處理登錄

- 在應用程序\ HTTP \ \控制器驗證\ AuthController

public function postCustomLogin(Request $request){ 
    $this->validateLogin($request); 

    $throttles = $this->isUsingThrottlesLoginsTrait(); 

    if ($throttles && $lockedOut = $this->hasTooManyLoginAttempts($request)) { 
     $this->fireLockoutEvent($request); 

     return $this->sendLockoutResponse($request); 
    } 

    $credentials = $this->getCredentials($request); 

    if (Auth::guard($this->getGuard())->attempt($credentials, $request->has('remember'))) { 

     // DO SOME STUFF HERE. I FIRE AN event() 
     event(new EventUserPlaylistChange()); 

     return $this->handleUserWasAuthenticated($request, $throttles); 
    } 

    if ($throttles && ! $lockedOut) { 
     $this->incrementLoginAttempts($request); 
    } 

    return $this->sendFailedLoginResponse($request); 
} 

- 在路線。覆蓋postLogin路線

Route::auth(); 
Route::post('login', 'Auth\[email protected]');