Обновление массива в сеансе в Laravel 5.5

Я пользуюсь 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

Решение

Кажется, проблема здесь

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

Вы запускаете оператор возврата до $request->session() поэтому код никогда не идет туда.

Просто установите обратную линию в конце.

1

Другие решения

Ну, я вроде решил свой вопрос. Очень просто добавить в запрос ajax.

async: false
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector