【问题标题】:MethodNotAllowedHttpException When i'm using Post Method [gloudemans-package]MethodNotAllowedHttpException 当我使用 Post 方法时 [gloudemans-package]
【发布时间】:2021-07-04 13:17:07
【问题描述】:

最近我正在尝试为我的作业项目创建一个购物车。我对这个框架很陌生,如果我问了一些愚蠢的问题,我很抱歉:(如果你们能帮我检查一下,我很高兴。Tks

我也在尝试切换到 GET 方法,但还是不行

错误是:

 MethodNotAllowedHttpException

这是我的控制器

public function cart() {

    if (Request::isMethod('post')) {
        $product_id = Request::get('product_id');
        $product = Product::find($product_id);
        Cart::add(array('id' => $product_id, 'name' => $product->name, 'qty' => 1, 'price' => $product->price));
    }
    if (Request::get('product_id') && (Request::get('increment')) == 1) {
        $rowId = Cart::search(array('id' => Request::get('product_id')));
        $item = Cart::get($rowId[0]);

        Cart::update($rowId[0], $item->qty + 1);
    }
    if (Request::get('product_id') && (Request::get('decrease')) == 1) {
        $rowId = Cart::search(array('id' => Request::get('product_id')));
        $item = Cart::get($rowId[0]);

        Cart::update($rowId[0], $item->qty - 1);
    }

    $cart = Cart::content();

    return view('cart', array('cart' => $cart, 'title' => 'Welcome', 'description' => '', 'page' => 'home'));}

这是我的路线

Route::post('cart', 'HomepageController@cart')->name('cart');

这是我的看法

@extends('layout')
@section('cart')       
<section id="cart_items">
    <div class="container">
        <div class="breadcrumbs">
            <ol class="breadcrumb">
                <li><a href="#">Home</a></li>
                <li class="active">Shopping Cart</li>
            </ol>
        </div>
        <div class="table-responsive cart_info">
            @if(count($cart))
            <table class="table table-condensed">
                <thead>
                    <tr class="cart_menu">
                        <td class="image">Item</td>
                        <td class="description"></td>
                        <td class="price">Price</td>
                        <td class="quantity">Quantity</td>
                        <td class="total">Total</td>
                        <td></td>
                    </tr>
                </thead>
                <tbody>
                    @foreach($cart as $item)
                    <tr>
                        <td class="cart_product">
                            <a href=""><img src="images/cart/one.png" alt=""></a>
                        </td>
                        <td class="cart_description">
                            <h4><a href="">{{$item->name}}</a></h4>
                            <p>Web ID: {{$item->id}}</p>
                        </td>
                        <td class="cart_price">
                            <p>${{$item->price}}</p>
                        </td>
                        <td class="cart_quantity">
                            <div class="cart_quantity_button">
                                <a class="cart_quantity_up" href=""> + </a>
                                <input class="cart_quantity_input" type="text" name="quantity" value="{{$item->qty}}" autocomplete="off" size="2">
                                <a class="cart_quantity_up" href='{{url("cart?product_id=$item->id&increment=1")}}'> + </a>
                                <a class="cart_quantity_down" href='{{url("cart?product_id=$item->id&decrease=1")}}'> - </a>
                            </div>
                        </td>
                        <td class="cart_total">
                            <p class="cart_total_price">${{$item->subtotal}}</p>
                        </td>
                        <td class="cart_delete">
                            <a class="cart_quantity_delete" href=""><i class="fa fa-times"></i></a>
                        </td>
                    </tr>
                    @endforeach
                    @else
                <p>You have no items in the shopping cart</p>
                @endif
                </tbody>
            </table>
        </div>
    </div>
</section> <!--/#cart_items-->
@endsection

【问题讨论】:

    标签: php laravel-5


    【解决方案1】:

    您正在使用a 标签,这不会发出POST 请求,相反,浏览器将按照链接发出GET 请求。这就是你得到MethodNotAllowedHttpException 的原因,因为它只期望在那个端点有一个POST 请求。您拥有的删除按钮也会出现同样的问题。

    这会很复杂,无法在答案中为您提供完整的解决方案。对于您正在尝试做的事情,您可以采取多种途径来完成这项工作。

    • 您可以在 HTML 中使用一个表单来发出 POST 请求,并且可能使用按钮来发布数量的增加和减少,和/或删除,然后重新加载更新后的页面。
    • 您可以使用 JS 在前端处理增量/减量/删除并更新数量字段,最后使用另一个按钮(例如结帐按钮)提交表单。 您还可以使用 Vue/React 之类的框架来简化此操作 轻松处理具有反应性的购物车行为/功能。

    注意事项:

    • 如果您只在路线中将Request::isMethod('post') 映射到POST,则不需要检查它。无论如何,每个端点都应该有 1 个方法。
    • 考虑使用FormValidation,而不是显式检查是否发送了值https://laravel.com/docs/8.x/validation
    • 您可能希望在更新后重定向到 show 方法,而不是返回视图。

    示例:

    <td class="cart_quantity">
      <div class="cart_quantity_button">
      <form action="{{ url('cart') }}" method="post">
        <input type="hidden" name="_token" value="{{ csrf_token() }}">
        <input type="hidden" name="product_id" value="{{ $item->id }}">
    
        <button type="submit" class="cart_quantity_up" name="increment"> + </button>
    
        <input class="cart_quantity_input" type="text" name="quantity" value="{{$item->qty}}" autocomplete="off" size="2" readonly>
    
        <button type="submit" class="cart_quantity_down" href='{{url("cart?product_id=$item->id&=1")}}' name="decrease"> - </button>
        </form>
      </div>
    </td>
    

    【讨论】:

    • 也许从larashout.com/… 获得灵感,它使用了一个包,但您可以了解流程。
    • 我已经将你所说的所有(a)标签包装成一个表单并使用 POST 方法,但它仍然无法在这里工作 IMG:imgur.com/t6bC3V2
    • 你的increment/decrement按钮在哪里?
    • 我想一步一步慢慢来。所以我决定先创建一个视图,然后再进行下一步(添加、增加、减少、删除)。
    • 查看什么?我为您的用例添加了一个示例。这应该替换按钮的td
    猜你喜欢
    • 1970-01-01
    • 2016-11-24
    • 2019-06-28
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 2019-12-01
    • 2019-02-12
    • 2016-05-23
    相关资源
    最近更新 更多