【问题标题】:Deleting a single product from a session array (Laravel sessions & PHP)从会话数组中删除单个产品(Laravel 会话和 PHP)
【发布时间】:2021-10-29 02:43:53
【问题描述】:

我目前正在开设一家网上商店,该商店提供不同类型的头发颜色,但我现在有点问题。我正在开发一个按钮,该按钮会自动从会话文件中删除一个产品。为此,我使用$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>

所以它应该从会话中检索一个特定的产品(从按下的任何产品按钮),然后它应该从会话中忘记该键。

谁能帮我解决这个问题?

附言。对不起我的词汇量。

【问题讨论】:

    标签: php laravel session mollie


    【解决方案1】:

    您从未分享过问题所在。它不工作吗?根据你的代码,我假设你得到了 perma 404

    一些提示:

    • 不用abort(404),直接用findOrFail($request-&gt;id)即可。
    • 当您可以利用Implicit Binding 时,无需执行findOrFail
    • 不用写&lt;input name="_method" type="hidden" value="delete" /&gt;,直接写@method('DELETE')即可。

    我假设您的问题是您使用的是$request-&gt;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;
    

    这仍然寻找存在的产品(不是随机的ids)。然后获取cart,查找id在那个cartunset中是否存在(删除),再次保存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');
    }
    

    【讨论】:

    • 好吧,我想请求会话数组,然后删除按下哪个按钮的特定产品。我可能需要通过 id 指定才能使其正常工作。我正在使用 $request->session()->forget('cart');从会话中删除它,但这会删除整个数组。所以我在这里需要一点帮助,因为每当我按下“删除”按钮时,我都无法请求会话数组并删除一个特定的产品
    • 如果你想这样做,你应该从会话中获取cart,直接从$cart中删除id,然后在会话替换中再次存储$cart旧的。
    • 所以你说我应该从变量 $cart 中删除 id 然后像“刷新”会话。有什么代码可以让我这样做吗?
    • @RickMondria 您的代码是正确的,除了我在答案中更改的部分,您按照我的方式更改它,它应该按预期工作! (记得删除$id = $request-&gt;id)。查看我的答案(我编辑了它)。
    • 这正是我想要的。它按预期工作。非常感谢您帮助我!
    猜你喜欢
    • 1970-01-01
    • 2015-08-29
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    相关资源
    最近更新 更多