2016-08-18 41 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]');