セッションを保存するためにデータベースドライバを使用しています。ペイロードを更新すると、ペイロードへのデータに依存するビューは更新されません。私のビューに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
を実行しようとしましたが、問題は解決しません。
私はこの作業を行うことができる唯一の方法は、ユーザーのすべてのセッションをテーブルに削除することです。私はこのようにしたくないので、何が分からないのですか?セッションの更新が期待どおりに機能しないのはなぜですか?
私がよく理解していれば、セッションはユーザーのログイン時にクライアント側に格納されます。 LogSuccesfulLoginイベント中に私のapp set()属性があるので、データベース上のペイロードを変更しても、トークンが一致しクライアントがデータを更新しないため、クライアント側のデータが変更されません。だから、今私は2つの選択肢がある。自分の権利を変更したときにユーザーのすべてのセッションを削除するか、リクエストごとにペイロードを変更する方法を見つけるか?そうですか? –
私はペイロードを '/ * * /'に変更したコードを変更し、この行を '$ sessions = DB :: table( 'sessions') - > where( 'user_id'、$ user-> id) > delete(); 'それは仕事をする、私は本当にそれがどのように好きではない。これは、ユーザーをログアウトせずに新しいセッションを生成します。すべてのセッションを削除せずにクライアント側のペイロードを変更する方法を理解できるようになるまで、私はこのようにします。 –