【问题标题】:Laravel - Update always throws "MethodNotAllowedHttpException No message"Laravel - 更新总是抛出“MethodNotAllowedHttpException No message”
【发布时间】:2019-05-15 01:09:24
【问题描述】:

根据我的研究,此错误与路由错误有关。无论我在更新函数中使用什么代码,都会引发此错误,这是有道理的。

但是我相信我所有的路线/表格都是正确的:

web.php

Route::get('orders/edit/{order}', 'OrderController@edit')->name('orders.edit');
Route::patch('orders/update', 'OrderController@update')->name('orders.update');

OrderController.php

public function edit(Order $order)
{
    $user = Auth::user();
    $meals = DB::table('products')
              ->leftJoin('order_product', function ($join) use ($order) {
                  $join->on('products.id', '=', 'order_product.product_id')
                       ->where('order_product.order_id', '=', $order->id);
              })
              ->select('products.*', 'order_product.qty')
              ->get();

    return view('orders.edit', compact('order', 'products', 'meals'));
}

public function update(Request $request,Order $order)
{
    //doesnt seem to matter what is in here but this is my return
    return redirect()->route('orders.checkout', $order->id);
}

edit.blade.php

{!! Form::open(['route' => 'orders.update', 'method' => 'patch']) !!}
    {{ Form::text('coupon', $order->coupon) }} // sample of an input I am using
    {{ Form::submit('Place Order') }}
{!! Form::close() !!}

更新

根据@rpm192 的建议,我尝试了:

{!! Form::open(['action' => ['orders.update', $order->id], 'method' => 'patch']) !!}

但是当加载 edit.blade.php 时,它抛出了我......

Action App\Http\Controllers\orders.update not defined. (View: /Users/now/Public/keto/resources/views/orders/edit.blade.php)

所以我然后尝试...

{!! Form::open(['action' => ['OrderController@update', $order->id], 'method' => 'patch']) !!}

但这让我很不爽……

Too few arguments to function App\Http\Controllers\OrderController::update(), 1 passed and exactly 2 expected

假设这是正确的方法,因为我现在越来越接近解决方案,它在寻找什么额外的参数?

【问题讨论】:

  • 尝试将:'route' => 'orders.update' 更改为:'action' => ['orders.update', $order->id]
  • @rpm192,我尝试了你的建议,并用我的结果更新了我的问题。
  • HTML 表单不支持 put/patch/delete 方法,因此您必须欺骗它们:
  • 你能从你的控制器中添加edit方法/函数吗?
  • @rpm192,我已将edit 方法添加到我的问题中。 @brad,这应该由我正在使用的 Laravel Collective 包中的 'method' => 'patch' 处理。

标签: laravel laravel-5 laravel-routing


【解决方案1】:

您的控制器需要订单的请求和 ID(因此它知道要更新哪一个)。

{!! Form::open(['action' => ['OrderController@update', $order->id], 'method' => 'post']) !!} // modified this
    {{ Form::text('coupon', $order->coupon) }}

    {{ Form::hidden('_method', 'PUT') }} // added this

    {{ Form::submit('Place Order') }}
{!! Form::close() !!}

如果这不起作用,请通过修改您的路线重试:

// from
Route::patch('orders/update', 'OrderController@update')->name('orders.update');

// to
Route::post('orders/update/{order}', 'OrderController@update')->name('orders.update');

【讨论】:

  • 所以这让我在刀片上抛出了 OrderController@update 不是路由的错误。所以我用路由名称orders.update 代替它,但它让我回到了原来的错误。我还尝试使用这种新的隐藏输入设置将Form::open 中的routeaction 交换,但这又引发了我原来的错误。
  • 想通了!除此之外,我还必须更改我的路线以包含 {order},如下所示:Route::any('orders/update/{order}','OrderController@update')->name('orders.update'); 非常感谢@rpm192
猜你喜欢
  • 2013-11-14
  • 2019-07-08
  • 2014-09-16
  • 2014-07-30
  • 2016-04-23
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
相关资源
最近更新 更多