Larevelでupdate機能を作成中ルーティングでputを定義しました。
その際にMethodNotAllowedHttpException No message
という
「POST
かGET
でルート指定がない」というエラーが発生してしまいました。
せっかくなので調べてまとめてみました。アウトプットのトレーニングも兼ねてやってみます。
結論から言うと、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メソッドは method
にPUT
, PATCH
, DELETE
,を受けとった場合、隠しメソッドフィールドも一緒に返してくれる機能があり、こちらの記述でも正常に動作するようです。