我的用户可以在“记住我”旁边打勾,这意味着他们将永远登录到 。当他们登录时,我用他们的订阅数据填充了自定义会话,这很好用。
问题是当他们关闭计算机后,第二天回来,而不是再次进行登录过程,而是自动加入“仪表板”页面(因为他们已经通过“记住我”登录了)进程),此时我的自定义会话不存在(并触发了错误)。
在App> Http>控制器> Auth> LoginController.php中,我有Login
函数,它会覆盖原始的Laravel函数,例如:
public function login(Request $request)
{
$this->validate($request, ['email' => 'required|email','password' => 'required']);
if (Auth::guard()->attempt($this->credentials($request), $request->remember))
{
$subscription = \App\Models\Subscriptions::where('id', \Auth::user()->subscription_id)->first();
\Session::put('subscription',
[
'id' => $subscription->id,
'name' => $subscription->name,
// etc..
]);
}
}
对我来说,这不是放置自定义会话的正确位置,但我不知道将其放置在何处。
问题:我应该在哪里创建每当用户登录/导航到任何页面时都必须初始化/创建的全局会话?
答案 0 :(得分:0)
对于改善您的代码,我有一些建议。您的登录功能应仅使用户登录即可。
据我所知,您正在将订阅ID存储在users表中。为什么不将用户ID存储在订阅表中?这样,您可以在这两个表之间创建关系,其中用户将只有一个预订(laravel的hasOne()
方法),而预订将属于用户(laravel的belongsTo()
方法)。阅读Laravel关于雄辩关系here的文档。
如果实现上述关系,则访问用户的订阅数据将像调用$user->subscription
一样容易。由于它很容易检索,因此无需在会话中存储任何内容,因为只要有机会(控制器,刀片服务器...),您就可以使用Auth::user()
来使已验证的用户。
您可以尝试延长会话的生存期,例如this,并将其设置为14天或20年,这样它就永远不会过期。
答案 1 :(得分:0)
已解决。
为了使会话数据始终保持最新状态,并考虑到“记住我”复选框,我使用了Laravel Authenticate Middleware来创建我的逻辑。由于auth
在每条路线中都被调用,在我看来,这是最好的选择。
为避免多次数据库调用,我将检查会话是否存在,并且仅在创建会话时检查会话是否存在。
App > Http > Middleware > Authenticate.php
the documentation允许我们使用称为handle
的现有函数。
public function handle($request, \Closure $next, ...$guards)
{
if (!\Session::get('subscription'))
{
// Apply code logic
}
// Same logic as the original function https://github.com/laravel/framework/blob/7.x/src/Illuminate/Auth/Middleware/Authenticate.php#L40
$this->authenticate($request, $guards);
return $next($request);
}
答案 2 :(得分:-1)
将您的代码放入AppServiceProvider.php中 将其写入boot()方法中。 引导方法中的代码将始终被首先检查。 阅读有关laravel文档的更多信息。