バリデーション
現在は、名前やコメントが空白だったり、 長すぎたりしてもそのまま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は
- 自動的にユーザーを以前のページヘリダイレクトします。
- バリデーションエラーは全部自動的にフラッシュデータとしてセッションへ保存されます。
- フラッシュデータとして保存されたバリデーションエラーは、自動的にグローバル変数の $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で表示させればエラー表示の完成です。
(Docker Toolboxの場合は http://(dockerのipアドレス)/messages )
でエラー表示を確認しましょう。