【问题标题】:MethodNotAllowedHttpException while update record in laravel在 laravel 中更新记录时出现 MethodNotAllowedHttpException
【发布时间】:2018-07-10 13:21:16
【问题描述】:

我最近加入了 Laravel 框架,所以首先我尝试在 laravel 中制作一个 CRUD 系统,以了解它们的基本原理和功能。

现在我在更新现有记录时遇到了一个错误MethodNotAllowedHttpException

在我的路线中

Route::resource('product', 'ProductController');

这给了我以下可能的路线列表

| GET|HEAD  | product                    | product.index          | App\Http\Controllers\ProductController@index   
| POST      | product                    | product.store          | App\Http\Controllers\ProductController@store    
| GET|HEAD  | product/create             | product.create         | App\Http\Controllers\ProductController@create     
| GET|HEAD  | product/{product}          | product.show           | App\Http\Controllers\ProductController@show        
| DELETE    | product/{product}          | product.destroy        | App\Http\Controllers\ProductController@destroy        
| PUT|PATCH | product/{product}          | product.update         | App\Http\Controllers\ProductController@update      
| GET|HEAD  | product/{product}/edit     | product.edit           | App\Http\Controllers\ProductController@edit   

编辑表单视图

    @extends('layouts.app')
@section('title','Product List')

@section('content')

<div class="container">
<form action="{{url('product/'.$product['id'])}}" class="form-horizontal">
  <div class="form-group">
    <label for="exampleInputEmail1">Name</label>
    {{csrf_field()}}
    {{ method_field('PUT')}}
    <!-- <input name="_method" type="hidden" value="PUT"> -->
    <input type="text" name="name" class="form-control" id="exampleInputEmail1" value="{{$product['name']}}" aria-describedby="emailHelp" placeholder="">

  </div>
  <div class="form-group">
    <label for="exampleInputEmail1">category</label>
    <input type="text" value="{{$product['category']}}"  class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" name="category" placeholder="">

  </div>
  <div class="form-group">
    <label for="exampleInputEmail1">weight</label>
    <input type="text" value="{{$product['weight']}}"  class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" name="weight" placeholder="">

  </div>
  <div class="form-group">
    <label for="exampleInputEmail1">price</label>
    <input type="text" value="{{$product['price']}}"  class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" name="price" placeholder="">

  </div>
  <button type="submit" class="btn btn-primary">Save</button>
</form>
</div>
@endsection

ProductController.php

public function update(Request $request, $product_id)
{
    $created = product::create($request->all());
   if($created){
    return redirect('product')->with('message','data added');
   }
}

在这种情况下,每当我想通过重新提交编辑表单来更改现有记录数据时。它会产生 MethodNotAllowedHttpException 错误。

我尝试了很多解决方案,但都没有解决。所以请指导我哪里出错了。谢谢

【问题讨论】:

  • 感谢您提出这个问题。

标签: php laravel laravel-5


【解决方案1】:

这是因为您使用了错误的 HTTP 方法来更新现有记录。您需要通过方法欺骗将方法指定为PUT。 试试这个:

<div class="container">
    <form action="{{ route('product.update', $product['id']) }}" method="POST" class="form-horizontal">
        {{ csrf_field() }}
        {{ method_field('PUT')}}    //method Spoofing
        <div class="form-group">
            <label for="exampleInputEmail1">Name</label>
            <input type="text" name="name" class="form-control" id="exampleInputEmail1" value="{{ $product['name'] }}" aria-describedby="emailHelp" placeholder="">
        </div>
        <div class="form-group">
            <label for="exampleInputEmail1">category</label>
            <input type="text" value="{{$product['category']}}"  class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" name="category" placeholder="">
        </div>

        <div class="form-group">
            <label for="exampleInputEmail1">weight</label>
            <input type="text" value="{{$product['weight']}}"  class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" name="weight" placeholder="">
        </div>

        <div class="form-group">
            <label for="exampleInputEmail1">price</label>
            <input type="text" value="{{$product['price']}}"  class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" name="price" placeholder="">
        </div>
        <input type="submit" name="submit" class="btn btn-primary">Save</button> //input type, not button
    </form>
</div>

【讨论】:

  • 好的,已添加。但它没有回应。我的网址栏填满了他们更改的数据..!
  • 显示您的完整表格
  • 抱歉,您要填哪张表格?
  • ...
  • 检查我的答案。
【解决方案2】:

对于update(),您需要使用PUT 方法。因此,将这一行添加到表单中:

<input name="_method" value="PUT" type="hidden">

【讨论】:

  • 好的,已添加。但它没有回应。我的网址栏填满了他们更改的数据..!
  • 只有在创建时才进行重定向。覆盖未创建的情况
  • 也许引用 bit from docs 它是如何工作的
  • @BugInspector ljubadr 是对的,只有当 $createdtrue 时,您才会重定向
  • 它已修复。谢谢:)
【解决方案3】:

我认为问题出在

<form action="{{url('product/'.$product['id'])}}" class="form-horizontal">

我解决了这个问题,在其中声明带有 method="POST" 的表单,然后:{{ method_field('PUT')}}

    @extends('layouts.app')
@section('title','Product List')

@section('content')

<div class="container">
<form method="POST" action="{{url('product/'.$product['id'])}}" class="form-horizontal">
  <div class="form-group">
    <label for="exampleInputEmail1">Name</label>
    {{csrf_field()}}
    {{ method_field('PUT')}}
    <!-- <input name="_method" type="hidden" value="PUT"> -->
    <input type="text" name="name" class="form-control" id="exampleInputEmail1" value="{{$product['name']}}" aria-describedby="emailHelp" placeholder="">

  </div>
  <div class="form-group">
    <label for="exampleInputEmail1">category</label>
    <input type="text" value="{{$product['category']}}"  class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" name="category" placeholder="">

  </div>
  <div class="form-group">
    <label for="exampleInputEmail1">weight</label>
    <input type="text" value="{{$product['weight']}}"  class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" name="weight" placeholder="">

  </div>
  <div class="form-group">
    <label for="exampleInputEmail1">price</label>
    <input type="text" value="{{$product['price']}}"  class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" name="price" placeholder="">

  </div>
  <button type="submit" class="btn btn-primary">Save</button>
</form>
</div>
@endsection

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2019-05-15
    • 2017-11-10
    • 2018-06-17
    • 2018-05-28
    • 1970-01-01
    相关资源
    最近更新 更多