laravel-5.8:此路由不支持POST方法。支持的方法:GET,HEAD

时间:2019-09-21 13:17:59

标签: laravel eloquent laravel-5.8

他试图在购物车中添加产品,但显示:此路线不支持POST方法。支持的方法:GET,HEAD ..(视图:\ resources \ views \ product \ detail.blade.php),我希望通过单击addtocart将其重定向到该年龄段的产品、、、、、、、、 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 ……………………………….. 、、、、、、、、、、、、、、、、、、、、、、、、、、、、 、、、、、、、、、、、、、、、、、、、、、、、、、、、 、、、、、、、、、、、、、、、、、、、、、 >

路线:

  Route::get('cart', 'Admin\ProductController@cart')->name('product.cart');

  Route::get('/addToCart/{product}', 'Admin\ProductController@addToCart')->name('addToCart');

控制器:

  public function cart()
  {
    if (!Session::has('cart')) {
        return view('products.cart');
    }
    $cart = Session::has('cart');
    return view('product.cart', compact('cart'));
  }

  public function addToCart(Product $product, Request $request)
  {
    if(empty(Auth::user()->email)){
        $data['email'] = '';    
    }else{
        $data['email'] = Auth::user()->email;
    }

    $oldCart = Session::has('cart') ? Session::get('cart') : null;
    $qty = $request->qty ? $request->qty : 1;
    $cart = new Cart($oldCart);
    $cart->addProduct($product);
    Session::put('cart', $cart);

    return redirect()->back()->with('flash_message_success', 'Product $product->title has been successfully added to Cart');
    }

视图:

   <form method="POST" action="{{ route('addToCart') }}" enctype="multipart/form-data">
                        <div class="btn-addcart-product-detail size9 trans-0-4 m-t-10 m-b-10">
                            @if($product->product_status == 1)
                            <!-- Button -->
                            <button class="flex-c-m sizefull bg1 bo-rad-23 hov1 s-text1 trans-0-4">
                                Add to Cart
                            </button>
                            @else Out Of Stock @endif
                        </div>
                        </form>

型号:

  <?php

  namespace App;

  use Illuminate\Database\Eloquent\Model;

  class Cart
  {
private $contents;
private $totalQty;
private $contentsPrice;

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

public function addProduct($product, $qty){
    $products = ['qty' => 0, 'price' => $product->price, 'product' => $product];
    if ($this->contents) {
        if (array_key_exists($product->slug, $this->contents)) {
            $product = $this->contents[$product->slug];
        }
    }

    $products['qty'] +=$qty;
    $products['price'] +=$product->price * $product['qty'];
    $this->contents[$product->slug] = $product;
    $this->totalQty+=$qty;
    $this->totalPrice += $product->price;
}

public function getContents()
{
    return $this->contents;
}
public function getTotalQty()
{
    return $this->totalQty;
}
public function getTotalPrice()
{
    return $this->totalPrice;
}
  }

2 个答案:

答案 0 :(得分:1)

首先,视图中的表单方法是POST,但是您没有发布路线。

第二,您定义的路由需要一个参数(产品),您可以按如下所示更改表单操作,但是我认为您想将用户发送到另一个页面,因此可以使用链接而不是表单。

这是表单操作:

action="{{ route('addToCart', $product->id) }}"

如果要使用链接,则可以执行以下操作:

<a href="{{ route('addToCart', $product->id) }}">.....</a>

答案 1 :(得分:0)

您的方法应为 POST 。在表单中,您将其称为Post方法,但在route.php文件中,您定义为get,将其更改为Route::post

Route::post('/addToCart/{product}', 'Admin\ProductController@addToCart')->name('addToCart');

此外,您的route.php文件期望{product},因此您需要以route形式传递它,以便您的操作像{{ route('addToCart',$product->id) }}

<form method="POST" action="{{ route('addToCart',$product->id) }}" enctype="multipart/form-data">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>