2016-09-14 105 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