ここでは投稿されたコメントを削除する機能を実装します.次のな手順で行います.
まず削除のためのルートを定義します.ここでリクエストメソッドに DELETE を用いていることに注意してください.
routes/web.php(抜粋)
Route::get('/comments', [CommentsController::class, 'index']) -> name('comments.index');
Route::get('/comments/{comment_id}', [CommentsController::class, 'show']) -> name('comments.show');
Route::get('/comments/{comment_id}/edit', [CommentsController::class, 'edit']) -> name('comments.edit');
Route::post('/comments', [CommentsController::class, 'store']) -> name('comments.store');
Route::patch('/comments', [CommentsController::class, 'update']) -> name('comments.update');
Route::delete('/comments/{comment_id}', [CommentsController::class, 'destroy']) -> name('comments.destroy');
次に,詳細ページのビューに削除のためのフォームを設置します.単なるリンクではなく,セキュリティを高めるためにもフォームにし,リクエストメソッドを DELETE にしています.
resources/views/comments/show.blade.php(抜粋)
<body>
<h1>コメント</h1>
<dl>
<dt>ID:</dt>
<dd>{{ $comment->id }}</dd>
<dt>Title:</dt>
<dd>{{ $comment->title }}</dd>
<dt>Body:</dt>
<dd>{{ $comment->body }}</dd>
</dl>
<p>
<a href="{{ route('comments.edit', ['comment_id' => $comment->id]) }}">
[編集]
</a>
</p>
<div>
<form action="{{ route('comments.destroy', ['comment_id' => $comment->id]) }}" method="post">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger">コメントの削除</button>
</form>
</div>
</body>
コントローラに destroy 関数を定義します.とりあえずは受け取った $comment_id
を表示するだけの雛形を作成します.
app/HTTP/Controllers/CommentsController.php(抜粋)
public function destroy($comment_id)
{
dd($comment_id);
}
この段階で,ひとまずコメントの削除ボタンを押下すると,/comments/{id} の URI に DELETE メソッドでリクエストが送信され,コメントの ID が表示されるはずです.ここで,同じ /comments/{id} の URL であっても,リクエストメソッドが GET であれば CommentsController@show が実行され,DELETE であれば CommentsController@destroy が実行されることがわかる.つまり,ユーザが適当な URI をブラウザに直接入力しても(GETメソッドになるため)削除されることはなく,正しいフォームからボタンを押下しなければ削除されない仕組みができていることを理解しよう.
削除ボタンを押すとコメントの ID だけが表示されました.
最後に,コントローラの destroy メソッドに削除の処理を実装します.
app/HTTP/Controllers/CommentsController.php(抜粋)
public function destroy($comment_id)
{
$comment = Comment::where('id', '=', $comment_id)
->first();
if (!$comment) {
return redirect('/comments');
}
$comment->delete();
return redirect('/comments');
}
実行して2つ目のコメントを削除してみます.
2つ目のコメントが削除できました.
なお,現時点でのルートの定義は次のようになっています.
vagrant@ubuntu2204 comment_app $ php artisan route:list ⏎
GET|HEAD / .........................................................................
POST _ignition/execute-solution ignition.executeSolution › Spatie\LaravelIgniti…
GET|HEAD _ignition/health-check ignition.healthCheck › Spatie\LaravelIgnition › Hea…
POST _ignition/update-config ignition.updateConfig › Spatie\LaravelIgnition › U…
GET|HEAD api/user ..................................................................
GET|HEAD comments ........................ comments.index › CommentsController@index
POST comments ........................ comments.store › CommentsController@store
PATCH comments ...................... comments.update › CommentsController@update
GET|HEAD comments/{comment_id} ............. comments.show › CommentsController@show
DELETE comments/{comment_id} ....... comments.destroy › CommentsController@destroy
GET|HEAD comments/{comment_id}/edit ........ comments.edit › CommentsController@edit
GET|HEAD sanctum/csrf-cookie sanctum.csrf-cookie › Laravel\Sanctum › CsrfCookieCont…
Showing [12] routes
vagrant@ubuntu2204 comment_app $