首页 > 解决方案 > 为什么 Post 方法在 Laravel 中给出错误 MethodNotAllowedHttpException

问题描述

我正在尝试在 Laravel 中提交表单,但收到错误消息:此路由不支持 POST 方法。支持的方法:GET、HEAD、PUT、PATCH、DELETE。

我已经尝试了laravel 中 post 方法中的建议给 MethodNotAllowedHttpException但没有一个有效。这是我的代码。

<div class="row" style="background: #ffffff;">
  <div class="col-lg-12 col-md-12 col-sm-12" style="background: white; margin: 10px">
    <form method="post" action="{{ route('companies.update',[$company->id]) }}">
      {{ csrf_field() }}

      <input type="hidden" name="method" value="put">

      <div class="form-group">
        <label for="company.name">Name <span class="required">*</span> </label>
        <input placeholder="Enter name" id="company-name" required name="description" spellcheck="false" class="form-control" value="{{ $company->name }}" />


      </div>

      <div class="form-group">
        <label for="company-content">Description</label>
        <textarea placeholder="Enter Description" style="resize: vertical" id="company-content" name="description" rows="5" spellcheck="true" class="form-control autosize-target text-left">
                                {{$company->description}}</textarea>
      </div>

      <div class="form-group">
        <input type="submit" class="btn btn-primary" value="Submit" />

      </div>

    </form>
  </div>

</div>

用get替换 post ,put删除错误但不做我想要的。

这些是我的路线

<?php


Route::get('/', function () {
    return view('welcome');
});

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');

Route::resource('companies','CompaniesController');
Route::resource('projects','ProjectsController');
Route::resource('roles','RolesController');
Route::resource('tasks','TasksController');
Route::resource('users','UsersController');

在 CompaniesController 我有

 public function update(Request $request, Company $company)
    {

        $companyupdates = Company::where('id', $company->id)->update([
            'name' => $request->input('name'),
            'description' => $request->input('description'),
        ]);

        if($companyupdates){
            return redirect()->route('companies.show', ['company'=>$company->id])->with('success','Company Updated Successfully');
        }
        return back()->withInput();
    }

我哪里错了?

标签: phphtmllaravel

解决方案


尝试改用刀片指令:

<form method="post" action="{{ route('companies.update',$company->id) }}">
      @csrf
      @method('PUT')

注意:您不需要使用 '[ ]' 传递公司 ID

在此输入中:

<input type="hidden" name="method" value="put">

名字要_method按照laravel表单方法spoofing

文档中的示例:

<form action="/foo/bar" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>

使用刀片指令:

<form action="/foo/bar" method="POST">
    @method('PUT')
    @csrf
</form>`

为什么会出现这个错误?

您在方法输入中输入了错误的名称,因此 laravel 会将此表单操作识别为 POST,而不是 PUT。由于是更新动作,laravel 会抛出这个错误。

HTML 表单不支持 PUT、PATCH 或 DELETE 操作。因此,在定义从 HTML 表单调用的 PUT、PATCH 或 DELETE 路由时,您需要向表单添加隐藏的 _method 字段。使用 _method 字段发送的值将用作 HTTP 请求方法:

欲了解更多信息:文档


推荐阅读