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 によるコメント掲示板の開発

投稿内容を検証する

データベースでの comments テーブルの構造は database/migrations/yyyy_mm_dd_hhmmss_create_comments_table.php というマイグレーションファイルで定義しました.title フィールドには最大255文字まで格納できますが,それ以上の長さの文字列は格納できません.また,title や body のフィールドが空白であるような投稿を受け付けても問題になるでしょう.したがって,フォームに入力された内容をコントローラで検証し,問題があればエラーメッセージを表示させるような機能を実装します.

Laravel のコントローラには validate() という入力内容を検証するメソッドが準備されているので,これを利用すれば簡単な検証を実装可能です.具体的には CommentsController の store 関数に次のような内容を追加すると良いでしょう.なお,テストを行いやすいように title を最大10文字に設定しています.手動のテストで動作を確認できたら,たとえば140文字など任意の値に変更すると良いでしょう.

app/HTTP/Controllers/CommentsController.php(抜粋)
public function store(Request $request)
{
    $this->validate($request, [
        'title' => 'required|max:10',  // 入力が必須で,最大10文字
        'body' => 'required'           // 入力が必須
    ]);

    $comment = new Comment();    // インスタンスを生成する
    $comment->title = $request->title; // タイトルをセット
    $comment->body = $request->body;   // 本文をセット
    $comment->save();                  // データベースに登録
    return redirect('/comments');      // リダイレクト
}

上の3行目から6行目のコードを追加しただけで入力内容が検証され,エラーがあった場合にはデータベースに登録されないようになりました.しかしながら,どのようなエラーがあったのかが表示されなければユーザに対して不親切であるし,以前に入力していた文字列が消えてしまうのも使い勝手が悪いので,そのあたりを改善します.

このために,まずはビューのフォームにエラー内容を表示させるためのコードを記載します.index.blade.php のフォームを次のように変更します.具体的には,エラーがあるときだけエラーの内容を表示するようにしています.

resources/views/comments/index.blade.php(抜粋)
<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="">
            @if ($errors->has('title'))
                <span class="error">{{ $errors->first('title') }}</span>
            @endif
        </p>

        <p>
            <label for="body">Body: </label>
            <textarea name="body" id="body" rows="4" cols="50"></textarea>
            @if ($errors->has('body'))
                <span class="error">{{ $errors->first('body') }}</span>
            @endif
        </p>
        <p>
            <input type="submit" value="投稿">
        </p>
    </form>
</div>

タイトルに11文字を入力し,本文を空欄にして投稿するとエラーが表示されました.しかしながら,入力していた文字列が消えてしまう設計は不親切です.

laravel10-2023-comment-29.png

エラーがあった場合に入力していた文字列を表示するには old ヘルパを利用します.

resources/views/comments/index.blade.php(抜粋)
<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="{{ old('title') }}">
                @if ($errors->has('title'))
                    <span class="error">{{ $errors->first('title') }}</span>
                @endif
            </p>

            <p>
                <label for="body">Body: </label>
                <textarea name="body" id="body" rows="4" cols="50">{{ old('body') }}</textarea>
                @if ($errors->has('body'))
                    <span class="error">{{ $errors->first('body') }}</span>
                @endif
            </p>
            <p>
                <input type="submit" value="投稿">
            </p>
        </form>
    </div>

上のように old ヘルパを利用することで,エラーの際に入力していた文字列が表示されるようになりました.また,タイトルや文字列が空ではなく,空白文字(スペース記号)だけが入力された場合にどのような動作になるのかはぜひチェックしてください.

laravel10-2023-comment-30.png

目次に戻る