バリデーション

現在は、名前やコメントが空白だったり、 長すぎたりしてもそのままINSERT処理が行われてしまいます。

バリデーションを追加して、不適切な内容の場合にはエラーメッセージを表示しましょう。

まずはコントローラのcreateメソッドにバリデーション処理を追加します。


    public function create(Request $request){

        // requestオブジェクトのvalidateメソッドを利用。
        $request->validate([
            'name' => 'required|max:20', // nameは必須、20文字以内
            'body' => 'required|max:100', // bodyは必須、100文字以内
        ]);

        // Messageモデルを利用して空のMessageオブジェクトを作成
        $message = \App\Message::new();

        // フォームから送られた値でnameとbodyを設定
        $message->name = $request->name;
        $message->body = $request->body;

        // messagesテーブルにINSERT
        $message->save();

        // メッセージ一覧ページにリダイレクト
        return redirect('/messages');
    }

validateメソッドを利用すると、 引数の内容に応じてバリデーションが行われます。

バリデーションに失敗した時の挙動

バリデーションに失敗した時のLaravelの挙動は特徴的ですので 把握しておきましょう。

バリデーションに失敗した時、Laravelは

  1. 自動的にユーザーを以前のページヘリダイレクトします。
  2. バリデーションエラーは全部自動的にフラッシュデータとしてセッションへ保存されます。
  3. フラッシュデータとして保存されたバリデーションエラーは、自動的にグローバル変数の $errors に保存されます。

では、これを踏まえて、view側にエラーメッセージの表示部分を追加しましょう。

index.blade.php

@extends('layouts.default')

@section('title', $title)

@section('content')
    <h1>{{ $title }}</h1>

    {{-- エラーメッセージを出力 --}}
    @foreach($errors->all() as $error)
    <p class="error">{{ $error }}</p>
    @endforeach

    {{-- 以下にフォームを追記します。 --}}
    <form method="post" action="{{ url("/messages") }}">
        {{-- LaravelではCSRF対策のため以下の一行が必須です。 --}}
        {{ csrf_field() }}
        <div>
            <label>
                名前:
                <input type="text" name="name" class="name_field" placeholder="お名前を入力">
            </label>
        </div>

        <div>
            <label>
                コメント:
                <input type="text" name="body" class="comment_field" placeholder="コメントを入力">
            </label>
        </div>

        <div>
            <input type="submit" value="投稿">
        </div>
    </form>

    <ul>
        @forelse($messages as $message)
            <li>{{ $message->name }}: {{ $message->body }}  {{ $message->created_at }}</li>
        @empty
            <li>メッセージはありません。</li>
        @endforelse
    </ul>
@endsection

上記のように、$errors->all() でエラーメッセージの配列を取得し、 @foreachで表示させればエラー表示の完成です。

http://localhost/messages

(Docker Toolboxの場合は http://(dockerのipアドレス)/messages )

でエラー表示を確認しましょう。

results matching ""

    No results matching ""