首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel-5.3 :更新会话无法正常工作

Laravel-5.3 :更新会话无法正常工作
EN

Stack Overflow用户
提问于 2017-02-01 07:59:21
回答 1查看 231关注 0票数 1

我使用数据库驱动程序来存储会话。当我更新有效负载时,依赖于有效负载中数据的视图不会更新。

在我看来,我经常会有这样的事情:

代码语言:javascript
复制
@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表中进行某些更改时不会出现问题。

问题是,当会话处于活动状态时,用户不会注销。如果我做了一些更改,视图将保持不变。

在我的用户控制器中发生了什么:

代码语言:javascript
复制
$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,但问题仍然存在。

我能做到这一点的唯一方法,就是将用户的所有会话都删除到表中。我不想走这条路,那么我错过了什么?为什么更新会话不能像我预期的那样工作?

EN

回答 1

Stack Overflow用户

发布于 2017-02-01 08:38:03

您的会话可能会丢失,因为您的响应不包含会话cookie。在laravel中,这是通过HTTP-Kernel中启动的AddQueuedCookiesToResponse中间件完成的。但是,由于您在控制器中的某处转储和死亡,您正在阻止这个中间件运行。

请注意,这只是一个猜测,可能还有其他原因导致您的cookie丢失。检查你的内核,也许还有你的config,并确保你可以在你的http response header中看到你的cookie。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41969721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档