delete~データの削除
データを削除するルーティングとしてdelete
が準備されている。
前提
モデルデータの操作で準備した枠組みを使う。ユーザー認証機能を持ち、ユーザーごとに入力されたシンプルな投稿記事Post
を扱う。
流れ
- DELETEメソッドでリクエスト
posts.delete
ルートでPostsController
のdestroy
アクションを実行destroy
アクションで指定されたデータを削除
destroyアクションの呼び出し
リソースルーティングで以下のように設定されていて、DELETEメソッドによるリクエストの場合、ドメイン/posts/(id)
からPostController
のdestroy
アクションにルーティングされる。ルーティング名はposts.delete
。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ php artisan route:list +--------+-----------+------------------------+------------------+------------------------------------------------------------------------+--------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+-----------+------------------------+------------------+------------------------------------------------------------------------+--------------+ ........ | | POST | posts | posts.store | App\Http\Controllers\PostController@store | web,auth | | | GET|HEAD | posts | posts.index | App\Http\Controllers\PostController@index | web,auth | | | GET|HEAD | posts/create | posts.create | App\Http\Controllers\PostController@create | web,auth | | | GET|HEAD | posts/{post} | posts.show | App\Http\Controllers\PostController@show | web,auth | | | DELETE | posts/{post} | posts.destroy | App\Http\Controllers\PostController@destroy | web,auth | | | PUT|PATCH | posts/{post} | posts.update | App\Http\Controllers\PostController@update | web,auth | | | GET|HEAD | posts/{post}/edit | posts.edit | App\Http\Controllers\PostController@edit | web,auth | ........ |
このルーティングにリクエストする場合、たとえばページの中にフォーム要素とINPUT
(type="submit")
要素を配置することが考えられる。
ここでルーティングに従えばDELETEメソッドを明示する必要があるが、現在のブラウザーではGETとPOSTしか認識しない。
フォームからDELETEメソッドをリクエストする場合、以下のようにフォームのmethod
ではPOSTを指定し、Laravelの@method
ディレクティブでDELETEを指定する。
1 2 3 4 5 6 7 |
@foreach ($posts as $post) <form class="delete" method="post" action="{{ route('posts.destroy', $post) }}"> @csrf @method('delete') <input type="submit" value="削除"> </form> @endforeach |
この例では、フォームのaction
先にroute()
メソッドを使い、第一引数でposts.daestroy
のルーティング名を、第2引数で削除対象のデータ$post
を渡している。これによってDELETE
メソッドでURIとしてドメイン名/posts/(id)
が渡される
なお@method
ディレクティブは、以下のようなhidden
要素を生成する。
1 |
<input type="hidden" name="_method" value="delete"> |
コントローラー~destroyアクション
ルーティングに従って、PostController
のdestroy
アクションを以下のように記述する。
1 2 3 4 5 6 7 8 9 10 11 |
class PostController extends Controller { ........ public function destroy($id) { $post = Post::find($id); $post->delete(); return redirect()->route('posts.index'); } ........ } |
ここでの要点は以下の通り。
destroy()
メソッドの引数で、URLに埋め込まれたid
が$id
として受け取られているPost
クラスのfind()
メソッドの引数に$id
を渡して、指定したidの記事インスタンスを$post
で参照している- 削除対象記事のインスタンス
$post
のdelete()
メソッドの引数に、更新対象の要素を渡している - データ削除を反映した一覧表示のため、
index
にリダイレクトしている
まとめ
以上の設定により、たとえばフォームに配置された削除ボタンを押すと、その記事のidがURLに埋め込まれてDELTEメソッドでリクエストされ、destroy
アクションでデータが削除される。