2017-01-31 5 views
0

セッションを保存するためにデータベースドライバを使用しています。ペイロードを更新すると、ペイロードへのデータに依存するビューは更新されません。私のビューにLaravel-5.3:セッションが正常に動作しない

は、私は多くの場合、そのようなものを持っている:

@if(Session::get('quicktrade') == 'Client') 
    <li class="@if ($coreData['navParent'] == 'quicktrade') active open @endif"> 
     <a href="javascript:;"> 
     <i class="ico-quicktrade-{{Session::get('left_menu')}}"></i> 
     <span class="title">QUICK[TRADE]</span> 
     <span class="arrow @if ($coreData['navParent'] == 'quicktrade') open @endif"></span> 
    @if ($coreData['navParent'] == 'quicktrade') <span class="selected"></span> @endif 
     </a> 
     <ul class="sub-menu"> 
      @if(Session::get('quicktrade_evaluation') == 1) 
      <li class="@if ($coreData['navChild'] == 'evaluation') active @endif"> 
       <a href="{{ url('/quicktrade/evaluation') }}"> 
       NOUVELLE ÉVALUATION</a> 
      </li> 
      @endif 
      @if (Session::get('quicktrade_liste') == 1) 
      <li class="@if ($coreData['navChild'] == 'liste') active @endif"> 
       <a href="{{ url('/quicktrade/liste') }}"> 
       LISTE DES VÉHICULES</a> 
      </li> 
      @endif 
      @if (Session::get('quicktrade_statistiques') == 1) 
      <li class="@if ($coreData['navChild'] == 'statistiques') active @endif"> 
       <a href="{{ url('/quicktrade/statistiques') }}"> 
       STATISTIQUES</a> 
      </li> 
      @endif 
     </ul> 
    </li> 
@endif 

は、このメニューは表示したり、オプションがセッションに依存しない作り。
LogSuccesfulLoginイベント中に、すべてのデータがペイロードに追加されます。
したがって、ユーザーがログアウトしてからログインすると、ユーザーテーブルに変更を加えても問題はありません。

問題は、セッションがアクティブで、ユーザーがログアウトしない場合です。いくつかの変更を行うと、以前と同じように表示されます。あなたは上記のコードで見ることができるように、2 dd()あり

$user = User::with('acces')->find($user->id); 

$sessions = DB::table('sessions')->where('user_id', $user->id)->get(); 
foreach ($sessions as $session) { 
    $payload = unserialize(base64_decode($session->payload)); 
    $payload['oneaction'] = $user->acces->oneaction; 
    $payload['oneaction_type'] = $user->acces->oneaction_type; 
    if ($user->acces->oneaction == 'Client') { 
     $payload['oneaction_clients'] = $user->acces->oneaction_clients; 
     $payload['oneaction_list'] = $user->acces->oneaction_list; 
     $payload['oneaction_creator'] = $user->acces->oneaction_creator; 
    } else { 
     $payload['oneaction_clients'] = 0; 
     $payload['oneaction_list'] = 0; 
     $payload['oneaction_creator'] = 0; 
    } 
    //dd($payload); 
    $payload = base64_encode(serialize($payload)); 
    DB::table('sessions')->where('id', $session->id)->update(['payload' => $payload]); 
} 

$sessions = DB::table('sessions')->where('user_id', $user->id)->get(); 
foreach ($sessions as $session) { 
    $payload = unserialize(base64_decode($session->payload)); 
    //dd($payload); 
} 

:私のユーザーのコントローラで

が起こる何があります。どちらも、変更が適切に行われていることを示しています。ページをリロードすると、左側のメニューに変更はありません。
セッションが更新された直後にphp artisan view:clearを実行しようとしましたが、問題は解決しません。
私はこの作業を行うことができる唯一の方法は、ユーザーのすべてのセッションをテーブルに削除することです。私はこのようにしたくないので、何が分からないのですか?セッションの更新が期待どおりに機能しないのはなぜですか?

答えて

0

レスポンスにセッションクッキーが含まれていないため、セッションが失われている可能性があります。 laravelではHTTP-Kernelで開始されたAddQueuedCookiesToResponseミドルウェアを介して行われます。しかし、コントローラのどこかにダンプして死んでいるので、このミドルウェアが実行されないようにしています。

これは単なる推測であり、あなたのクッキーが紛失している他の理由があることにご注意ください。カーネルをチェックしてconfigとし、http response headerにCookieが表示されていることを確認してください。

+0

私がよく理解していれば、セッションはユーザーのログイン時にクライアント側に格納されます。 LogSuccesfulLoginイベント中に私のapp set()属性があるので、データベース上のペイロードを変更しても、トークンが一致しクライアントがデータを更新しないため、クライアント側のデータが変更されません。だから、今私は2つの選択肢がある。自分の権利を変更したときにユーザーのすべてのセッションを削除するか、リクエストごとにペイロードを変更する方法を見つけるか?そうですか? –

+0

私はペイロードを '/ * * /'に変更したコードを変更し、この行を '$ sessions = DB :: table( 'sessions') - > where( 'user_id'、$ user-> id) > delete(); 'それは仕事をする、私は本当にそれがどのように好きではない。これは、ユーザーをログアウトせずに新しいセッションを生成します。すべてのセッションを削除せずにクライアント側のペイロードを変更する方法を理解できるようになるまで、私はこのようにします。 –

関連する問題