【问题标题】:Session has does not work until second request会话直到第二次请求才起作用
【发布时间】:2017-08-16 03:07:05
【问题描述】:

我正在使用 Laravel 制作一个简单的网站,在我的 PagesController 中,我有一个函数可以将项目存储到会话中,如果项目尚未存储在会话中,则增加 cartCount

在我的网站上,我在每个项目上都有一个按钮,单击该按钮时,会使用 AJAX 将 'item_id' 发送到调用函数 postToCart 的网站。我要做的是:成功添加项目后返回item_name

当我第一次单击该按钮时,它告诉我该项目已被添加,这正是我想要的。问题是,当我第二次按下按钮时,函数postToCart又进入了if语句。问题只是第二次发布请求之后一切正常。

public function postToCart(Request $request) {
    $id = $request->input('item_id');
    $item = Item::all()->where('item_id', '=', $id)->first();

    if (!session()->has($id))
    {
        session()->put($id, 1);
        session(['cartCount' => session('cartCount') + 1]);

        return $item->item_name;
    }
}

客户端的 AJAX:

function cart_click(id, url) {
    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });

    $.ajax({
        type: 'POST',
        url: url,
        data: {
            'item_id': id
        },
        success: function(result){
            if (result)
            {
                alert('Item added: '.concat(result));
            }
            else
            {
                alert('Item already in cart');
            }
        }
    });
}

【问题讨论】:

  • 你确定,第一个请求也输入if语句,第二个也输入?是否有可能第一个请求在某处被忽略/出错?
  • 是的,因为我在客户端的 ajax 中实现了成功函数,并且我使用的是alert(id),所以我知道什么时候会返回。
  • 您可以在javascript 中使用localStorage
  • 我可以,但 Laravel 也应该可以正常工作。
  • 你能贴出success function implementation in ajax on client side的代码

标签: php laravel session laravel-5 session-variables


【解决方案1】:

我认为几乎不需要澄清。

首先更改postToCart()函数以在两种情况下都返回一些值(成功+失败)

public function postToCart(Request $request) {
    $id = $request->input('item_id');
    $item = Item::all()->where('item_id', '=', $id)->first();

    $value = session($id, 0); 
    if ($value == 0)
    {
        session([$id => 1]);
        session(['cartCount' => session('cartCount') + 1]);

        return $item->item_name;
    }

    return "1"; 
}

其次在AJAX回调函数中,检查返回值,是否有正确的消息值清楚地显示发生了什么。例如我把“1”作为已经存在,否则我认为它是成功插入的。

success: function(result){
            if (result == "1")
            {
                alert('Item already in cart');
            }
            else
            {
                alert('Item added: ' + result);
            }
        }

【讨论】:

  • 两种情况下变量result的值是多少?
  • 在对同一个项目的前两个请求中,如果项目的结果值是名称,并且在第三个请求中的结果值为“1”。
  • 我已经更改了会话,在postToCart() 中使用全局会话助手获取/设置。试试这个。
  • 我已经检查过了,现在又检查了一遍,结果是一样的。
  • 但是如果我在 if 语句之前加上session([$id => 1]);,那么该语句将永远不会被执行,这似乎是第一次没有将项目插入到会话中。
猜你喜欢
  • 2015-01-02
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多