Php Laravel在用户登录时保留会话

Php Laravel在用户登录时保留会话,php,laravel,Php,Laravel,我的用户可以勾选“记住我”,这意味着他们将永远登录。当他们登录时,我用他们的订阅数据填充一个自定义会话,这很好 问题是,当他们关闭电脑,第二天回来时,他们不会再次经历登录过程,而是自动加入“仪表板”页面(因为他们已经通过“记住我”过程登录),此时我的自定义会话不存在(并触发错误) 在App>Http>Controllers>Auth>LoginController.php中,我有一个Login函数,它覆盖了原来的Laravel函数,如下所示: public function login(Requ

我的用户可以勾选“记住我”,这意味着他们将永远登录。当他们登录时,我用他们的订阅数据填充一个自定义会话,这很好

问题是,当他们关闭电脑,第二天回来时,他们不会再次经历登录过程,而是自动加入“仪表板”页面(因为他们已经通过“记住我”过程登录),此时我的自定义会话不存在(并触发错误)

在App>Http>Controllers>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..
        ]);
    }
}
对我来说,这不是放置自定义会话的正确位置,但我不知道放在哪里


问题:我应该在哪里创建必须在用户登录/导航任何页面时初始化/创建的全局会话?

将代码放入AppServiceProvider.php 将其写入boot()方法中。 引导方法中的代码将始终首先检查。
阅读有关laravel文档的更多信息。

我有一些关于改进代码的建议。您的登录功能只需让用户登录即可

使用关系! 从我看到的情况来看,您正在用户表中存储订阅id。为什么不在订阅表中存储用户id?这样,您可以在这两个表之间创建一个关系,其中用户只有一个订阅(laravel的
hasOne()
方法),而订阅将属于用户(laravel的
belongsTo()
方法)。阅读Laravel关于雄辩关系的文档

如果您不需要,请不要使用会话! 如果实现上述关系,访问用户订阅数据将与调用
$user->subscription
一样简单。由于它非常容易检索,因此不需要在会话中存储任何内容,因为您可以随时使用
Auth::user()
获取经过身份验证的用户(控制器、刀片服务器等)

如果你还想继续上课。。。
您可以尝试延长会话的生存期,如,并将其设置为14天或20年,这样它就永远不会过期。

已解决。

为了使会话数据始终保持最新,并考虑到“记住我”复选框,我使用了Laravel认证中间件来创建我的逻辑。由于每个路由都会调用
auth
,因此在我看来这是最好的选择

为了避免多次数据库调用,我在创建会话时检查会话是否存在,如果不存在,则只检查会话是否存在

App>Http>Middleware>Authenticate.php
允许我们使用名为
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);
}

多个用户属于一个订阅,而不是相反,这就是为什么它在用户表上。我不想使用
$user->subscription
,因为这意味着每次刷新页面时,都会对数据库进行查询。不过,您应该使用关系,其中user有一个()订阅,subscription有多个()用户,而不是像上面那样编写查询。此外,如果不希望每次都查询数据库,可以使用Laravel的缓存将结果缓存一段时间。该查询应该是超快速的,而且您不必担心每次都会为此查询数据库:)