Почему метод Post выдает ошибку MethodNotAllowedHttpException в Laravel - PullRequest
2 голосов
/ 12 апреля 2019

Я пытаюсь отправить форму в Laravel, но получаю сообщение об ошибке Метод POST не поддерживается для этого маршрута. Поддерживаемые методы: GET, HEAD, PUT, PATCH, DELETE.

Я пробовал предложения в метод post в laravel дать 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 , 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');

В контроллере компаний у меня есть

 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();
    }

Куда я иду не так?

1 Ответ

4 голосов
/ 12 апреля 2019

Попробуйте вместо этого использовать директивы лезвия:

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

Примечание : вам не нужно передавать идентификатор компании с '[]'

В этом входе:

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

Имя должно быть _method в соответствии со спуфингом метода формы laravel

Пример из документов:

<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. Таким образом, при определении маршрутов PUT, PATCH или DELETE, которые вызываются из формы HTML, вам необходимо добавить в форму скрытое поле _method. Значение, отправленное с полем _method, будет использоваться в качестве метода HTTP-запроса:

Для получения дополнительной информации: Документы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...