Laravel 10 入門トップページ


目次

  1. プロジェクトを作成する
  2. データベースファイルを作成する
  3. Visual Studio Code を設定する
  4. .env を編集して初期設定する
  5. タイムゾーンと言語を設定する
  6. Webサーバを起動して終了する
  7. マイグレーションファイルを生成する
  8. テスト用データを設定する
  9. モデルを作成する
  10. コントローラを作成する
  11. ルートを定義する
  12. データベースからデータを取り出す
  13. トップページにリンクを設置する
  14. ビューを使ってレコードを表示する
  15. コメントを個別に表示するページを作成する
  16. コメント投稿機能を実装する
  17. 投稿内容を検証する
  18. 投稿内容を編集する
  19. 投稿コメントを削除する
  20. テストの自動化を実現する
  21. テストカバレッジを計測する
  22. 複数のLinuxコマンドを実行し,履歴からも実行する
  23. ビューをレイアウト化する
  24. Bootstrap を導入する
  25. SQLite を操作する
  26. フェイカでシーダを拡張する
  27. ページネーションを作る
  28. シーダに登録日時と更新日時を追加する
  29. 一覧表示を更新日時の降順にする
  30. フラッシュメッセージを表示する
  31. スタイルシートでデザインを整える

Laravel によるコメント掲示板の開発

投稿コメントを削除する

ここでは投稿されたコメントを削除する機能を実装します.次のな手順で行います.

  1. ルートを定義
  2. 詳細ページのビューに削除のためのフォームを設置
  3. コントローラにメソッドを追加

まず削除のためのルートを定義します.ここでリクエストメソッドに 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メソッドになるため)削除されることはなく,正しいフォームからボタンを押下しなければ削除されない仕組みができていることを理解しよう.

laravel10-2023-comment-33.png

削除ボタンを押すとコメントの ID だけが表示されました.

laravel10-2023-comment-34.png

最後に,コントローラの 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つ目のコメントを削除してみます.

laravel10-2023-comment-35.png

2つ目のコメントが削除できました.

laravel10-2023-comment-36.png

なお,現時点でのルートの定義は次のようになっています.

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 $

目次に戻る