2016-09-14 106 views
0

我试图设置会话,但user_id列总是null。其他列工作正常。是user_id保留任何东西?这是否发生在任何人身上? 我在这里尝试的是验证用户,将数据保存到会话并重定向到仪表板。 下面是代码:Laravel会话表user_id始终为空

public function login(Request $request) 
{ 
    $validator = validator::make($request->all(),[ 
     'username' => 'required', 
     'password' => 'required' 
    ]); 

    if($validator->fails()){ 
     return redirect('/') 
     ->withInput() 
     ->withErrors($validator); 
    } 
    $username = $request->get('username'); 
    $user = User::where('username', $username)->first(); 
    $checkpass = false; 
    if(!empty($user)){ 
     $password = $request->get('password'); 
     $dbpass = $user->getAttributes()['pass']; 
     $checkpass = Hash::check($password, $dbpass); 
     if($checkpass){ 
      //saving session after success login check 
      $request->session()->put('id',\Session::getId()); 
      $request->session()->put('user_id', $user->id); 
      $request->session()->put('ip_address', $request->ip()); 
      $request->session()->put('user_agent', $request->header('User-Agent')); 
      $request->session()->put('payload', base64_encode($request->getContent())); 
      $request->session()->put('last_activity', time()); 
      //redirect to dashboard 
      return redirect('/dashboard'); 
     } 
    } 
    if(empty($user) || $checkpass == false){ 
     $errors = new MessageBag(['password'=>['Email and/or password invalid.']]); 
     return redirect('/') 
     ->withErrors($errors) 
     ->withInput(Input::except('password')); 
    } 



} 
+0

你可以显示代码的其余部分从哪里得到值 – tam5

+0

@tam仅$ request-> session() - > put('user_id',11);给我null其他人都很好。有没有发生过任何人? – BulletProof47

+0

这不是我问的问题,从你的问题中就很清楚。我问了更多信息。尽管如此,我有一种预感。当您将请求作为已通过身份验证的用户时,user_id仍然为空吗? – tam5

回答

2

您正在使用database会话驱动程序。 Laravel将因此通过Illuminate\Session\DatabaseSessionHandler.php处理会议。如果您查看源代码,则会发现一种方法getDefaultPayload,只要您将该会话记录到数据库,就会调用该方法getDefaultPayload

在此方法中,你会发现这一点:

if ($container->bound(Guard::class)) { 
    $payload['user_id'] = $container->make(Guard::class)->id(); 
} 

这台user_id通过Laravel的Guard当前登录的用户。但是,由于您未使用Guard登录,因此此方法会将当前用户标识视为null,这就是为什么您始终会获得null

此外,事实上您正在设置的属性都没有设置。相反,它们都在DatabaseSessionHandler.phpgetDefaultPayload方法中设置。

这是您应该从确定将Laravel的数据库会话与您的实施集成在一起的最佳方式开始的地方。由于我没有关于您的应用程序的更多信息,因此我无法给出更进一步的方向,因为最佳解决方案可能是什么,以及最佳的变更是什么。如果不知道任何事情,我可能会考虑将您的登录系统与Laravel Guard集成,因为它也提供了其他一些功能。或者,更快的解决方案可能是直接修改getDefaultPayload方法的这一位。

+0

我已经用完整的登录方法更新了这个问题。那么对我来说最适合什么呢? – BulletProof47

+1

@ BulletProof47我已阅读您的代码。我不明白为什么您需要通过Laravel提供的默认身份验证选择此登录系统。我的建议是重构你的代码以使用laravel的认证系统。你仍然可以做你正在做的所有事情(从你展示的代码中),它会变得更简单。如果您需要帮助,请告知我 – tam5

+0

因此,我无法更新会话user_id?如果没有,那么我当然会使用默认身份验证?你能指点我一些好的教程吗?谢谢 – BulletProof47