データベースに登録されたコメントの一覧表示と個別表示ができるようになったので,今度は新規にコメントを投稿する機能を実装しよう.
まずは,投稿ボタンが押下された時のルートを routes/web.php に定義します.フォームからデータを送信してデータベースに登録するような場合には,HTTP(または HTTPS)の POST メソッドを利用します.次のように /comments に POST でアクセスしたときに CommentsController の store 関数を呼び出すようにします.
routes/web.php(抜粋)
Route::get('/comments', [CommentsController::class, 'index']) -> name('comments.index');
Route::get('/comments/{comment_id}', [CommentsController::class, 'show']) -> name('comments.show');
Route::post('/comments', [CommentsController::class, 'store']) -> name('comments.store');
次に,コメント一覧ページ (/comments) に新規投稿フォームを設置します.なお,16行目の @csrf
は,フォームにトークンを仕込むための命令です.
resources/views/comments/index.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>コメント一覧</title>
</head>
<body>
<h1>コメント一覧</h1>
<ul>
@foreach ($comments as $comment)
<li>
<a href="{{ route('comments.show', ['comment_id' => $comment->id]) }}">
{{ $comment->title }}
</a>
</li>
@endforeach
</ul>
<h1>コメント投稿</h1>
<div>
<form method="post" action="{{ route('comments.store') }}">
@csrf
<p>
<label for="title">Title: </label>
<input type="text" name="title" id="title" value="">
</p>
<p>
<label for="body">Body: </label>
<textarea name="body" id="body" rows="4" cols="50"></textarea>
</p>
<p>
<input type="submit" value="投稿">
</p>
</form>
</div>
</body>
</html>
一覧ページを表示すると,コメント投稿フォームを確認できました.このページの HTML ソースをブラウザで確認します.
すると,29行目で,method="post"
になっていることが確認できると同時に,30行目にある通りトークンが仕込まれていることも確認できます.このトークンはランダムな値が自動的に与えられるので,毎回異なるはずです.このトークンは不正な書き込みを防止するための仕組みで,トークンが含まれないアクセス,不正なトークンを持つアクセス,有効期限切れトークンを持つアクセスなどを Laravel が自動的に排除してくれます.
コントローラに store 関数を定義します.とりあえずはフォームに入力されたパラメータを取り出す方法を確認します.
app/HTTP/Controllers/CommentsController.php(抜粋)
public function store(Request $request)
{
dd($request, $request->title, $request->body);
}
実際にタイトルと本文を入力して投稿ボタンを押下します.この結果,dd()
によってパラメータの内容が表示されました.$request
にはさまざまな値が記録されており,$request->title
や $request->body
のようにすると入力内容を取得できることがわかります.
それでは,投稿内容を実際にデータベースに登録します.具体的には Comment
クラスのインスタンスを生成して,タイトルと本文の内容をセットし,save()
によってデータベースに登録します.登録後は一覧ページにリダイレクトします.CommentsController の store 関数を次のように変更します.
app/HTTP/Controllers/CommentsController.php(抜粋)
public function store(Request $request)
{
$comment = new Comment(); // インスタンスを生成する
$comment->title = $request->title; // タイトルをセット
$comment->body = $request->body; // 本文をセット
$comment->save(); // データベースに登録
return redirect('/comments'); // リダイレクト
}
実際に投稿できることを確認してください.