LoginSignup
6
9

More than 1 year has passed since last update.

【隠しメソッドフィールド】LaravelのルーティングでPUTを定義した際にエラーが出た話。

Last updated at Posted at 2021-03-12

Larevelでupdate機能を作成中ルーティングでputを定義しました。
その際にMethodNotAllowedHttpException No message という
POSTGETでルート指定がない」というエラーが発生してしまいました。

せっかくなので調べてまとめてみました。アウトプットのトレーニングも兼ねてやってみます。

結論から言うと、HTMLのformがputの形式をサポートしていないことによるエラーのようでした。

今回はformファサードを利用しているので以下のコードでした。

edit.blade.php
// 修正前
{!! Form::open(['route' => ['report.update', $dailyReport ->id], 'method' => 'POST']) !!}
{!! Form::close() !!}
edit.blade.php
//変更後
{!! Form::open(['route' => ['report.update', $dailyReport ->id], 'method' => 'POST']) !!}
   {!! Form::hidden('_method', 'put') !!}
{!! Form::close() !!}

実際にはLaravelではPUTなどの形式はPOST送信されています。
送信形式を判断してもらうためには、LaravelではPOST送信内にhidden_methodプロパティを指定する必要があります。
このhidden入力を利用しPUTのメソッド名を送信しましょう。
これはPUT, PATCH, DELETEなども同様です。

ちなみにformファサードを使わない場合は以下のように記述します。
<input type="hidden" name="_method" value="PUT">

さらに、bladeというテンプレートエンジンを使用していることからbladeディレクティブを使い、以下のようにも書くことができます。

edit.blade.php
{!! Form::open(['route' => ['report.update', $dailyReport ->id], 'method' => 'POST']) !!}
   @method('put')
{!! Form::close() !!}

@method という隠しメソッドフィールド生成用の記述を使用するため、よりわかりやすい記述となっています。

さらにさらに、Form::openの methodの値を PUT にしてしまえば隠しメソッドフィールドも必要なくなるとのこと。

edit.blade.php
{!! Form::open(['route' => ['report.update', $dailyReport ->id], 'method' => 'PUT']) !!}
{!! Form::close() !!}

Formファサードのopenメソッドは methodPUT, PATCH, DELETE,を受けとった場合、隠しメソッドフィールドも一緒に返してくれる機能があり、こちらの記述でも正常に動作するようです。

6
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
9