【问题标题】:Update array in session in Laravel 5.5在 Laravel 5.5 的会话中更新数组
【发布时间】:2018-04-16 03:07:46
【问题描述】:

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

    @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
  }
]

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

【问题讨论】:

    标签: php jquery laravel blade laravel-5.5


    【解决方案1】:

    问题似乎在这里

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

    您在 $request-&gt;session() 之前运行 return 语句,因此代码永远不会去那里。

    只需将返回线设置在末尾即可。

    【讨论】:

    • 是的,我错过了这个,但仍然无法保存到会话。
    • 你有一个条件if (session()-&gt;has('cartitems')),所以我猜caritems会话在你调用这个方法之前总是存在的?如果你 var_dump($request-&gt;session()-&gt;get('cartitems')) ,在验证之后,它会给你什么?
    • 是的,它存在。在测试过程中,我还返回了原始数组与修改后的数组进行比较。
    • 因此,您在会话中推送的数组已填满。例如,如果您检查另一个变量(test,1),它也不起作用吗?我认为您也可以删除忘记行,因为 put 将替换以前的内容
    • 一种形式一切正常。但如果生成了两个或多个表单,则会话中的结果是不正确的。由于某种原因,第二个 Ajax 请求的处理采用原始数组而不是第一个处理中保存的数组。
    【解决方案2】:

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

    async: false
    

    【讨论】:

      猜你喜欢
      • 2020-06-06
      • 1970-01-01
      • 2020-03-25
      • 2017-06-10
      • 2018-08-25
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      相关资源
      最近更新 更多