在 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
我正在使用 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