2017-01-31 1 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.
Итак, если пользователь вышел из системы, а затем войдите в систему, у меня не возникло проблем, когда я внес некоторые изменения в таблицу users.

Проблема заключается в том, что сеанс активен, и пользователь не выходит из системы. Если я сделаю некоторые изменения, представление останется таким же, как и раньше.

В моем контроллере пользователя есть то, что происходит:

$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); 
} 

Как вы можете видеть в приведенной выше коде, есть 2 dd(). Оба показывают, что изменения сделаны правильно. Когда я перезагружаю страницу, в левом меню нет изменений.
Я попытался сделать php artisan view:clear сразу после того, как сессии были обновлены, но проблема сохраняется.
Единственный способ, которым я могу сделать эту работу, - это удалить все сеансы пользователя в таблицу. Я не хочу идти этим путем, так что мне не хватает? Почему обновление сеанса не работает, как я ожидаю?

ответ

0

Ваша сессия, вероятно, потеряна, потому что ваш ответ не содержит сеансового файла cookie. В laravel это делается через AddQueuedCookiesToResponse middlware, который стартует в вашем HTTP-Kernel. Но поскольку вы сбрасываете и умираете где-то в своем контроллере, вы предотвращаете запуск этого middlware.

Обратите внимание, что это всего лишь предположение, могут быть другие причины, по которым ваш файл cookie теряется. Проверьте свое ядро ​​и, возможно, также ваш config и убедитесь, что вы можете видеть свой файл cookie в своем http response header.

+0

Если я хорошо понимаю, сессия хранится на стороне клиента при входе пользователя в систему. Поскольку атрибуты app set() во время события LogSuccesfulLogin, даже если я изменяю полезную нагрузку в базе данных, это не изменяет данные на стороне клиента, потому что токен по-прежнему совпадает, а клиент не обновляет данные. Итак, теперь у меня есть 2 выбора. Удаление всех сеансов пользователей при изменении его прав или поиск способа изменить полезную нагрузку по каждому запросу? Это правильно? –

+0

Я изменил код, в котором меняю полезную нагрузку на '/ * * /', и добавил эту строку '$ sessions = DB :: table ('sessions') -> где ('user_id', $ user-> id) - > удалить(); '. Это делает работу, мне не очень нравится, как она это делает. Он генерирует новый сеанс без выхода пользователя из системы. Я сделаю так, пока не смогу понять, как изменить полезную нагрузку на стороне клиента, не удаляя каждую сессию. –

 Смежные вопросы

  • Нет связанных вопросов^_^