在 Laravel 5.5 中更新 session 中的数组

Update array in session in Laravel 5.5

我正在使用 Laravel 5.5.19,最近遇到了一个不愉快的情况。 我在 blade 模板中生成了一些表格:

    @foreach($products as $product)

    <form id="product{{$product['id']}}" class="cartitem">
        <input type="hidden" class="cartitemid" name="cartitemid" value="{{$product['id']}}">
        <input type="text" class="count" name="count" value="{{$product['count']}}">
        <input type="hidden" name="cartid" value="{{$product['cartid']}}">
        {{ csrf_field() }}
    </form>

    @endforeach
<button id="refresh"  type="button" class="btn btn-danger" name="refresh" onClick="refresh(this);">Refresh</button> 

然后表单序列化并通过 Jquery 发送到控制器:

function refresh(btn){
    btn.blur();
    if ($('.cartitem').length) {
    $(".cartitem").each(function(){
        var data = $(this).serialize();
        $.ajax({
            url: '/cart/refresh',
            type: 'POST',
            data: data,
            success: function (response) {
              var str = JSON.stringify(response.cart, null, 2);
            console.log(response.id);
            console.log(response.count);
            console.log(str);
            }
        });
        location.reload();
});
}
}

控制器代码:

    public function refresh(Request $request){  
    if (session()->has('cartitems')) {  
    $validatedData = $request->validate([
                   'cartitemid' => 'required|numeric',
                   'count' => 'required|numeric|between:1,255',
                   'cartid' => 'required|string|max:10',
                ]);
            $cartitems = $request->session()->get('cartitems');

                    $count = $validatedData['count'];
                    $id = $validatedData['cartitemid'];
                            foreach ($cartitems as $cartitem => $value){
                                if ($value['id'] == $id){
                                    $cartitems[$cartitem]['count'] = $count;

                                }
                            }
$response = array(
          'cart' => $cartitems,
          'count' => $count,
          'id' => $id,
      );

                  $request->session()->forget('cartitems');
                  $request->session()->put('cartitems', $cartitems);
                  return response()->json($response);
    }
    }

由于某种原因,它无法正常工作。在某些迭代中不保存数组。这也不适用于数据库或 cookie 驱动程序。

更新 代码正在运行。我在控制台中得到输出,如下所示:

1
1
1
[
  {
    "id": 1,
    "productid": "1",
    "count": "1",
    "price": 10001.2
  }
]

但在 session 中仍然是一个旧数组。

问题似乎出在这里

return response()->json($response);
              $request->session()->forget('cartitems');
              $request->session()->put('cartitems', $cartitems);

你 运行 在 $request->session() 之前的 return 语句所以代码永远不会去那里。

只需在末尾设置 return 行。

好吧,我有点解决了我的问题。非常简单,只需添加 ajax 请求即可。

async: false