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アクションでデータが削除される。