目次
エラー
ググって他の人と同じようにしたはずなんだけど。。なんでできないのでしょうか?
<input type=”hidden” name=”_method” value=”DELETE”> の一文がいらないよ。
エラー
The DELETE method is not supported for this route. Supported methods: GET, HEAD, POST
結論
《誤》
<form method="post" action="{{ route('user.delete', $user->id) }}">
<input type="hidden" name="_method" value="DELETE">
@csrf
<button type="submit" class="btn btn-danger">OK</button>
</form>
《正》
<form method="post" action="{{ route('user.delete', $user->id) }}">
@csrf
<button type="submit" class="btn btn-danger">OK</button>
</form>
なぜ「The DELETE method is not supported for this route. Supported methods: GET, HEAD, POST」なのか
削除できました~!でもなんで<input>の一文が必要なかったのでしょうか?
actionで指定されているメソッドへ移動して、処理をするでしょ?でもweb.phpでpostを指定しているからだよ
Route::get('/', 'ListController@index')->name('list');
Route::post('delete/{id}', 'DeleteController@delete')->name('delete');
Route::get('edit/{id}', 'EditController@index')->name('edit');
Route::post('edit/{id}', 'EditController@update');
actionがなくても同じURLだとpostしてくれる
なるほど~。他のページでこんな記述を見つけました。edit.blade.phpはactionがないのになんでeditのpostだと認識して処理をおこなってくれるのでしょうか?
<form method="post">
actionは指定がなければ自分自身に返される(htmlの決まり)からだよ。なので今回はedit.blade.phpでユーザー情報編集画面を出しているからURLは既に、https://○○○○/editになっていて、そのpostだからRoute::post(‘edit/{id}’, ‘EditController@update’); という判定をしてくれるからactionの記述がなくても処理に移ってくれるんだ。
なるほど!じゃあ、ユーザーの削除をしたいときも、ユーザー編集と同じように、まずdelete.blade.phpで削除確認の画面を出してURLがhttps://○○○○/delete になった状態から、Route::post(‘delete/{id}’, ‘DeleteController@delete’)->name(‘delete’); をすればいいんですね
<form method="post">
@csrf
:
: (登録内容記述)
:
<div class="text-center">
<button type="submit" class="btn btn-primary">登録</button>
</div>
</form>
formとaタグの違い
削除ボタンを押すだけなのに<form></form>内に特に記述もないのに、なんでformを使うのでしょうか?<a href=”{{ route(‘user.delete’, $user->id) }}”>じゃダメなのでしょうか?
<form>は<form></form>で囲われた中に記載されている、inputの値などの情報も一緒に届けたいから使用するんだけど、今回の場合はRoute::post(‘delete/{id}’, ‘DeleteController@delete’)->name(‘delete’); で削除する対象のユーザーidも一緒に届けたいので<form>を使うべきだよね。しかも<a>は基本的にgetだから次のページに遷移するときに使うよね。
laravelの@methodを用いた方法
@methodを使った書き方もあるみたいだけど。。
疑似フォームメソッドというもので普通はHTMLの隠しフィールドに_methodを使用するんだけど、laravelではこれを@method(‘DELETE’)だけでできるんだよ。便利だね。
Route::post('delete/{id}', 'DeleteController@delete')->name('delete');
// @method を使用する場合
Route::delete('delete/{id}', 'DeleteController@delete')->name('delete');
// 一般的なHTMLでのdeleteの方法
<form action="/foo/bar" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
// @method を使用する場合
<form action="{{ route('delete', $user->id) }}" method="post">
@csrf
@method('DELETE')
<input type="submit" value="delete">
</form>