我使用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
}
]
但是在会话中仍然是一个旧阵列。
答案 0 :(得分:1)
问题似乎在这里
return response()->json($response);
$request->session()->forget('cartitems');
$request->session()->put('cartitems', $cartitems);
您在$request->session()
之前运行return语句,因此代码永远不会去那里。
只需在最后设置返回行。
答案 1 :(得分:0)
好吧,我有点解决了我的问题。非常简单,只需添加ajax请求即可。
async: false