【LaravelでformからDELETE】methodやのsubmitやのactionやの…あんまりわかってなかったけど理解した!

エラー

ググって他の人と同じようにしたはずなんだけど。。なんでできないのでしょうか?

<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’)だけでできるんだよ。便利だね。
参考 laravel 公式ドキュメント
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>

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です