用户可以属于许多俱乐部,因此当他们登录时,我希望获得该关系并将其缓存在Auth::user()
中,以便我可以在整个应用程序中检查它,而不必每次都访问数据库。 / p>
我一直在研究这个但却无法找到任何信息。我最接近的建议是向authenticated()
添加自定义Http\Controllers\Auth\AuthController
方法。我做了,但它没有给我任何东西。
protected function authenticated(Request $request, $user)
{
$user->load('memberships');
}
有人可以就如何解决这个问题给我一些指示吗?
答案 0 :(得分:1)
一个非常简单的方法是听取'Illuminate\Auth\Events\Login'
事件,当它发生时,检查俱乐部是否在会话中。如果不是,请查询数据库并将其添加到会话中,然后从会话中返回。
虽然它们在技术上没有附加到由User
返回的Auth::user()
模型,但效果是一样的,您只需通过{{1}从会话中抓取它们}。
从技术上来说,想要将某些内容缓存到模型中并将其存储在缓存中并不是有意义的,因为缓存是相同的,但这并不是你真正想做的事情。在所有用户中,所以会话就是放置它的正确位置。
答案 1 :(得分:0)
解决方案:在验证用户特征中覆盖 postLogin(),以便您可以自由处理登录
- 在App \ Http \ Controllers \ Auth \ 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\AuthController@postCustomLogin');