Laravel

【Laravel】掲示板を作成する(5)

Laravelによる掲示板の作成、第5回です。
今回は「投稿編集」機能と「投稿の物理削除」機能についてポストします。

9.投稿編集機能の作成

投稿を編集できるようにします。
ユーザー登録をし、投稿した本人が編集するといったような機能はなく、単に管理者がデータベースに登録されているデータを画面上から編集するというものです。

ルーティング追記

編集ファイル:routes/web.php

edit と update を追加します。
editが編集フォーム画面、updateが編集実行のアクションという割当です。

Postsコントローラーを編集

編集ファイル:app\Http\Controllers\PostsController.php

編集画面ビューを作成

編集画面のビューを作成します。今回は create 用のビューをコピーして改変ました(だいぶ楽)。

編集ファイル:resources\views\bbs\edit.blade.php

投稿内容をフォームへ反映するには

名前やメッセージなど元の投稿内容は、三項演算で判定して value に設定しています。
該当部分を抜粋します。

「疑似フォームメソッド」について

フォームの上の方に

という記述がありますが、これはLaravelのhttpメソッドでは GETリクエストとPOSTリクエストしか対応しておらず、PUTやPATCH、DELETEリクエストを使用する際は「擬似フォームメソッド」というものを使用ます。
擬似フォームメソッドは、フォームのパラメータとして擬似的にメソッド名を埋め込み、それに合わせてLaravel側で擬似的にputやdeleteを扱う仕組みとのことです。

『HTTPメソッドに意味をもたせて機能性を分ける』というのがRESTという概念で、Laravelの場合、ルーティングはURLとHTTPメソッドの組に対して定義されますので、使い分けないとリクエストが正しく処理されません。
LaravelのRESTコントローラでは、新規作成のstoreはPOST、更新のupdateはPATCH(PUT)が対応しています。PUTとPATCHはフレームワークとしては同等の扱いですが、HTTP メソッドの意図からすると使い分けがある、とのことです。

POST

● 新規に追加する場合

PUT(PATCH)

● 更新する場合

DELETE

● 削除する場合

今回はこれ以上詳しくは調べず(苦笑)
理解できるまでは「お約束」とか「おまじない」というレベルで覚えておきましょう(乱暴)

ビューに「編集する」ボタンを追加

投稿詳細画面

詳細画面の上の方に、編集画面へのボタンを追加します。

編集ファイル:resources\views\bbs\show.blade.php

投稿一覧画面

編集ファイル:resources\views\bbs\index.blade.php

既存のボタンへリンク先を追加します。

投稿の編集後画面のキャプチャ

10.投稿の物理削除機能の作成

次に投稿を削除できるようにします。
投稿用テーブルのカラムに is_deleted を用意していますが、まずは物理削除させてみます。

Postモデル、Commentモデルにてリレーション設定が行われているため、投稿に紐づくコメントがある場合は削除するメソッド内で明示的に削除実行するようすれば投稿と同時に削除してくれる(はず)です。

ルーティングの追記

例によってまずはルーティングの設定です。「destroy」メソッドを使えるようにします。

編集ファイル:routes\web.php

削除する役割のメソッド名がdestroyと物々しいですが、今回ルーティングに指定している各メソッド名は artisan コマンドに「--resource」オプションを付けてコントローラーを作成したときに自動的に作成される標準のメソッド名となっています。

実際にやってみます。

ここまで楽してよいのかちょっと不安になりますね(笑)

Postsコントローラーを編集

編集ファイル:app\Http\Controllers\PostsController.php

ビューに「削除する」ボタンを追加

投稿詳細画面

詳細画面の上の方、編集ボタンと横並びになるように「削除する」ボタンを追加します。

編集ファイル:resources\views\bbs\show.blade.php

投稿一覧画面

編集ファイル:resources\views\bbs\index.blade.php

既存のボタンへリンク先を追加します。

削除実行

投稿ID:36を例に動作の確認を行います。
投稿ID:36には、コメントが2件(ID:71、72)登録されています。

削除前のキャプチャ

データベース確認

投稿テーブル

コメントテーブル

詳細画面より削除を行います。
リダイレクト先を一覧画面としているので、フラッシュメッセージが表示され、先頭にあったID:36の記事がなくなっています。

データベース確認

投稿テーブル

コメントテーブル

投稿を削除することで、リレーション設定しているコメントも削除することができました。
論理削除もそのうちに作成してみたいと思います。

とりあえず今回はここまでです。
次回は投稿画面の「カテゴリー」をプルダウン化するのと、特定カテゴリーの記事のみを表示する検索機能を実装したいと思います。

-Laravel
-, ,