【问题标题】:Problem with passing id via GET in Laravel在 Laravel 中通过 GET 传递 id 的问题
【发布时间】:2019-12-26 14:14:22
【问题描述】:

Laravel 框架 6.9 + XAMP

我需要有 Laravel 经验的人的建议,因为我有一些我无法解释的奇怪问题。

刀片模板有一个按钮,可以通过产品 ID 将商品添加到购物车:

<div class="buy d-flex justify-content-between align-items-center">
     <div class="price text-success"><h5 class="mt-4">$ {{$product->price}}</h5></div>
     <a href="{{route('product.addToCart', ['id'=>$product->id] )}}" class="btn btn-danger mt-3"><i class="fas fa-shopping-cart"></i> Add to Cart</a>
</div>

但是当点击按钮时什么都没有发生。没有传递产品 ID,只传递#。

这是我调用的 web.php 路由:

    Route::get('add-to-cart/{id}', [
    'uses' => 'ProductController@getAddToCart',
    'as' => 'product.addToCart'
]);

也试过了:

//Route::get('add-to-cart/{id}', 'ProductController@getAddToCart')->name('product.addToCart'); 

这也不起作用。

这是购物车模型:

<?php
namespace App;
class Cart
{
    public $items = null;
    public $totalQty = 0;
    public $totalPrice = 0;


    public function __construct($oldCart)
    {
        if ($oldCart) {
            $this->items = $oldCart->items;
            $this->totalQty = $oldCart->totalQty;
            $this->totalPrice = $oldCart->totalPrice;
        }
    }

    public function add($item, $id) {
        $storedItem = ['qty' => 0, 'price' => $item->price, 'item'=> $item];
        if ($this->items) {
            if (array_key_exists($id, $this->items)) {
                $storedItem = $this->items[$id];
            }
        }
        $storedItem['qty']++;
        $storedItem['price'] = $item->price * $storedItem['qty'];
        $this->items[$id] = $storedItem;


        $this->totalQty++;
        $this->totalPrice += $item->price;
    }
}

这是产品控制器:

namespace App\Http\Controllers;

use App\Product;

use Illuminate\Http\Request;
use App\Cart;
use Session;

class ProductController extends Controller
{

    public function index()
    {
        $products = Product::all();
        return view('shop.index', ['products' => $products]);
    }

    public function getAddToCart(Request $request, $id) {
        $product = Product::find($id);
        $oldCart = Session::has('cart') ? Session::get('cart') : null;

        $cart = new Cart($oldCart);
        $cart->add($product, $product->id);

        $request->session()->put('cart', $cart);
        //dd($request->session()->get('cart'));
        return redirect()->route('index');
    }
}

如果我只是传入 URL:/add-to-cart/{prod id} 并输入,它可以工作 - 我可以看到带有产品详细信息的“购物车”的 dd(),因此该路线有效。只有按钮没有!

让我发疯。我究竟做错了什么? Laravel 中是否有一些我不知道的“功能”?

    dd($product)
App\Product {#279 ▼
  #fillable: array:3 [▼
    0 => "title"
    1 => "description"
    2 => "price"
  ]
  #connection: "mysql"
  #table: "products"
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  #perPage: 15
  +exists: true
  +wasRecentlyCreated: false
  #attributes: array:7 [▼
    "id" => 2
    "created_at" => "2019-12-22 18:05:40"
    "updated_at" => "2019-12-22 18:05:40"
    "imagePath" => "https://s3.eu-central-1.amazonaws.com/bootstrapbaymisc/blog/24_days_bootstrap/vans.png"
    "title" => "Neque quia sit facere."
    "description" => "Seven flung down his cheeks, he went on growing, and, as the door opened inwards, and Alice's elbow was pressed hard against it, that attempt proved a failure.  ▶"
    "price" => 29
  ]
  #original: array:7 [▶]
  #changes: []
  #casts: []
  #dates: []
  #dateFormat: null
  #appends: []
  #dispatchesEvents: []
  #observables: []
  #relations: []
  #touches: []
  +timestamps: true
  #hidden: []
  #visible: []
  #guarded: array:1 [▶]
}

购物车装满产品。

【问题讨论】:

  • 那么正在生成的href 是什么?此外,您可能希望将此作为 POST 操作而不是 GET。
  • 按钮不起作用怎么办?当你点击它时会发生什么?你最终的网址是什么?等
  • 你试过这个{{route('product.addToCart', $product-&gt;id )}} 吗?
  • 浏览器中的网址为空。只有 # 到达那里。我也试过 {{route('product.addToCart', $product->id )}} - 没有任何反应
  • 转储您的产品对象以查看它是否是实际对象@dd($product)

标签: laravel routing


【解决方案1】:

从我看到的情况来看,您的路线似乎没有正确重定向。在您的控制器中,操作定义为

public function getAddToCart(Request $request, $id)

但在您的按钮中,您只传递了id 参数。

尝试在你的控制器中重新定义你的方法来

public function getAddToCart($id)

这应该可以解决问题。

【讨论】:

  • 如果我从产品控制器中删除请求,没有任何变化。虽然我可以 dd() 'cart' 的内容,但没有通过 {{Session::has('cart') 添加到购物车中? Session::get('cart')->totalQty : ''}}
  • @PinPiguin 您是否尝试对会话变量执行 dd 以验证您的会话中有购物车?我从您的评论中假设您正在正确路由更改,是这样吗?
  • 如果我这样做:dd($request->session()->get($cart));我收到错误 array_key_exists(): 第一个参数应该是来自购物车的字符串或整数。在那里我通过了 $item 和 $id。我通过在 url 中传递 /add-to-cart/2 来做到这一点,因为该按钮不起作用 - 由于某种原因它从未连接过我在尝试单击它时得到 # :(
  • session()-&gt;get('cart'),get 方法采用“密钥”,因此您之前会执行类似$request-&gt;session()-&gt;put('cart', $cart); 的操作。请参阅laravel.com/docs/5.8/session#storing-data,可能会有所帮助。
猜你喜欢
  • 2017-05-27
  • 2019-04-05
  • 2016-12-29
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多