从会话数组中删除单个产品(Laravel 个会话 & PHP)
Deleting a single product from a session array (Laravel sessions & PHP)
我目前正在一家网店工作,该网店销售不同类型的头发颜色,但我现在遇到了一个问题。我正在研究一个自动从会话文件中删除一个产品的按钮。为此,我使用了 $request->session()->forget('cart');
行。
这是我的控制器的样子:
public function index()
{
// Dit zorgt ervoor dat alle producten in het tabel Product-
// opgehaald worden en in de variabele $products gezet worden
$products = Product::all();
return view('winkelmand', compact('products'));
}
/**
* Show the form for creating a new resource.
*
* @return void
*/
public function create()
{
return false;
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return Application|Factory|View
*/
public function store(Request $request)
{
$product = Product::find($request->id);
if (!$product) {
abort(404);
}
$id = $request->id;
$cart = session()->get('cart');
// Als het winkelwagendje leeg is, dan is dit het eerste product
if (!$cart) {
$cart = [
$id => [
"name" => $product->name,
"description" => $product->description,
"price" => $product->price,
"quantity" => 1
]
];
session()->put('cart', $cart);
return view('winkelmand');
}
// Als het product al bestaat, dan de quantiteit verhogen met 1
if (isset($cart[$id])) {
$cart[$id]['quantity']++;
session()->put('cart', $cart);
return view('winkelmand');
}
// Als het product niet bestaat dan toevoegen met quantiteit = 1
$cart[$id] = [
"name" => $product->name,
"price" => $product->price,
"description" => $product->description,
"quantity" => 1
];
session()->put('cart', $cart);
return view('winkelmand');
}
/**
* Display the specified resource.
*
* @param Request $request
* @param int $id
* @return Application|Factory|View
*/
public function show(Request $request, $id)
{
return false;
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
return false;
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* // * @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request)
{
if ($request->id && $request->quantity) {
$cart = session()->get('cart');
$cart[$request->id]["quantity"] = $request->quantity;
session()->put('cart', $cart);
session()->flash('success', 'Cart updated successfully');
}
}
/**
* Remove the specified resource from storage.
*
* // * @param int $id
* @return string
*/
public function destroy(Request $request)
{
//Deze functie moet ervoor zorgen dat er door middel van een knop de
// desbetreffende item verwijderd wordt uit het winkelwagentje.
// Deze functie werkt alleen nog niet en wordt dus niet gebruikt in de webshop
$request->session()->forget('cart');
dd('cart');
return view('winkelmand');
}
我使用表单和方法 POST
添加了一个按钮到 HTML:
<td>
<form action="/winkelmand/{{ $id }}" method="POST">
@csrf
<input name="_method" type="hidden" value="delete" />
<input type="submit" value="x" />
</form>
</td>
所以它应该从会话中检索一个特定的产品(从任何产品按钮被按下)然后它应该忘记会话中的那个键。
有人可以帮我吗?
Ps。对不起我的词汇量。
您从未分享问题所在。它不起作用吗?根据您的代码,我假设您正在获得 perma 404
.
一些提示:
- 不用
abort(404)
,直接用findOrFail($request->id)
即可。
- 当您可以利用 Implicit Binding 时,无需执行
findOrFail
。
- 不用写
<input name="_method" type="hidden" value="delete" />
,直接写@method('DELETE')
即可。
我假设你的问题是你正在使用 $request->id
但你从来没有发送 id
。 URL 中有 id
,但要使代码正常工作,您应该:
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return Application|Factory|View
*/
public function store(Request $request, $id)
{
$product = Product::findOrFail($id);
记得把这部分代码换成我上面的:
public function store(Request $request)
{
$product = Product::find($request->id);
if (!$product) {
abort(404);
}
$id = $request->id;
这仍然会查找存在的产品(没有随机的 id
s)。然后获取cart
,查找cart
和unset
中是否存在id
(删除),再次保存cart
,完成。
public function destroy(Request $request, $id)
{
Product::findOrFail($id);
$cart = session()->get('cart');
if (isset($cart[$id])) {
unset($cart[$id]);
session()->put('cart', $cart);
}
return view('winkelmand');
}
我目前正在一家网店工作,该网店销售不同类型的头发颜色,但我现在遇到了一个问题。我正在研究一个自动从会话文件中删除一个产品的按钮。为此,我使用了 $request->session()->forget('cart');
行。
这是我的控制器的样子:
public function index()
{
// Dit zorgt ervoor dat alle producten in het tabel Product-
// opgehaald worden en in de variabele $products gezet worden
$products = Product::all();
return view('winkelmand', compact('products'));
}
/**
* Show the form for creating a new resource.
*
* @return void
*/
public function create()
{
return false;
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return Application|Factory|View
*/
public function store(Request $request)
{
$product = Product::find($request->id);
if (!$product) {
abort(404);
}
$id = $request->id;
$cart = session()->get('cart');
// Als het winkelwagendje leeg is, dan is dit het eerste product
if (!$cart) {
$cart = [
$id => [
"name" => $product->name,
"description" => $product->description,
"price" => $product->price,
"quantity" => 1
]
];
session()->put('cart', $cart);
return view('winkelmand');
}
// Als het product al bestaat, dan de quantiteit verhogen met 1
if (isset($cart[$id])) {
$cart[$id]['quantity']++;
session()->put('cart', $cart);
return view('winkelmand');
}
// Als het product niet bestaat dan toevoegen met quantiteit = 1
$cart[$id] = [
"name" => $product->name,
"price" => $product->price,
"description" => $product->description,
"quantity" => 1
];
session()->put('cart', $cart);
return view('winkelmand');
}
/**
* Display the specified resource.
*
* @param Request $request
* @param int $id
* @return Application|Factory|View
*/
public function show(Request $request, $id)
{
return false;
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
return false;
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* // * @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request)
{
if ($request->id && $request->quantity) {
$cart = session()->get('cart');
$cart[$request->id]["quantity"] = $request->quantity;
session()->put('cart', $cart);
session()->flash('success', 'Cart updated successfully');
}
}
/**
* Remove the specified resource from storage.
*
* // * @param int $id
* @return string
*/
public function destroy(Request $request)
{
//Deze functie moet ervoor zorgen dat er door middel van een knop de
// desbetreffende item verwijderd wordt uit het winkelwagentje.
// Deze functie werkt alleen nog niet en wordt dus niet gebruikt in de webshop
$request->session()->forget('cart');
dd('cart');
return view('winkelmand');
}
我使用表单和方法 POST
添加了一个按钮到 HTML:
<td>
<form action="/winkelmand/{{ $id }}" method="POST">
@csrf
<input name="_method" type="hidden" value="delete" />
<input type="submit" value="x" />
</form>
</td>
所以它应该从会话中检索一个特定的产品(从任何产品按钮被按下)然后它应该忘记会话中的那个键。
有人可以帮我吗?
Ps。对不起我的词汇量。
您从未分享问题所在。它不起作用吗?根据您的代码,我假设您正在获得 perma 404
.
一些提示:
- 不用
abort(404)
,直接用findOrFail($request->id)
即可。 - 当您可以利用 Implicit Binding 时,无需执行
findOrFail
。 - 不用写
<input name="_method" type="hidden" value="delete" />
,直接写@method('DELETE')
即可。
我假设你的问题是你正在使用 $request->id
但你从来没有发送 id
。 URL 中有 id
,但要使代码正常工作,您应该:
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return Application|Factory|View
*/
public function store(Request $request, $id)
{
$product = Product::findOrFail($id);
记得把这部分代码换成我上面的:
public function store(Request $request)
{
$product = Product::find($request->id);
if (!$product) {
abort(404);
}
$id = $request->id;
这仍然会查找存在的产品(没有随机的 id
s)。然后获取cart
,查找cart
和unset
中是否存在id
(删除),再次保存cart
,完成。
public function destroy(Request $request, $id)
{
Product::findOrFail($id);
$cart = session()->get('cart');
if (isset($cart[$id])) {
unset($cart[$id]);
session()->put('cart', $cart);
}
return view('winkelmand');
}