我正在制作laravel购物车,现在正在使用laravel会话。
我的想象是:
我可以将产品推送到会话中,但是对于第一个产品,当我再添加一次相同的产品时,就添加了该产品,但是第二,第三...产品可以正常工作。
我尝试了很多时间,但没有找到解决方法。你能帮我吗?
这是我的带有添加方法的CartController *
public function add(Request $request)
{
$cartItems = session('cart');
$productInfoToCart = array(
"id" => request('id'),
"name" => request('name'),
"code" => request('code'),
"price" => request('price')
);
if ($cartItems !== null){
if (array_search(request('id'), array_column($cartItems, 'id'))) {
return redirect ('/cart')->with('status', 'Product exists, you can change quantity before payment');
} else {
$request->session()->push('cart', $productInfoToCart);
$request->session()->flash('status', 'Product added to cart');
return redirect('/cart');
}
} else {
$request->session()->push('cart', $productInfoToCart);
$request->session()->flash('status', 'First Product added to cart');
return redirect('/cart');
}
}
答案 0 :(得分:0)
您应该创建一个Cart类,并且不对控制器中的cart逻辑进行编码。您正在将数据存储在会话中,但将来可能会将其存储在其他位置,并且此代码将不再起作用,因此请尽量不要将逻辑与存储系统耦合。
您还可以轻松地简化代码(在其中使用返回语句时,没有多余的“ if else”)
public function add()
{
$cartItems = session('cart');
$productInfoToCart = array(
"id" => request('id'),
"name" => request('name'),
"code" => request('code'),
"price" => request('price')
);
if ($cartItems !== null){
if (isset($cartItems[request('id')]){
return redirect ('/cart'); //...
}
$cartItems[request('id')] = $productInfoToCart;
$request->session()->put('cart', $cartItems);
$request->session()->flash('status', 'Product added to cart');
return redirect('/cart');
}
$cartItems[request('id')] = $productInfoToCart;
$request->session()->put('cart', $cartItems);
$request->session()->flash('status', 'First Product added to cart');
return redirect('/cart');
}
答案 1 :(得分:0)
最后,我找到了解决方法,只需编辑此行:
if (array_search(request('id'), array_column($cartItems, 'id')))
收件人:
if (array_search(request('id'), array_column($cartItems, 'id')) !== false)
因为也许旧行将返回搜索键,而不是逻辑结果,所以我无法运行下一个逻辑命令。