Laravelでは、リクエストのバリデーションを簡単に適用できる仕組みが提供されています。本記事では、以下の内容について詳しく解説します。
-
Request
クラスを使ったバリデーション - Controller内でのバリデーション
-
Validator
クラスの活用 - Bladeテンプレートでのエラーメッセージの表示
- 動的なフィールド名のバリデーション
-
old
ヘルパーを用いたエラー時の入力保持
1. Request
クラスを使ったバリデーション
バリデーションルールを Request
クラス内で定義する方法です。
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class CommentRequest extends FormRequest
{
public function rules()
{
return [
'comment' => 'required|string|max:1000',
];
}
public function messages()
{
return [
'comment.required' => 'コメントは必須です。',
'comment.string' => 'コメントは文字列である必要があります。',
'comment.max' => 'コメントは1000文字以内で入力してください。',
];
}
}
Controllerで適用する際は以下のように記述します。
use App\Http\Requests\CommentRequest;
public function store(CommentRequest $request)
{
$validatedData = $request->validated();
// 保存処理など
}
2. Controller内でのバリデーション
Request
クラスを使わず、Controller内でバリデーションを適用する場合は以下のように記述します。
public function store(Request $request)
{
$validatedData = $request->validate([
'comment' => 'required|string|max:1000',
], [
'comment.required' => 'コメントは必須です。',
'comment.string' => 'コメントは文字列である必要があります。',
'comment.max' => 'コメントは1000文字以内で入力してください。',
]);
// バリデーション通過後の処理
}
3. Validator
クラスの活用
Validator
クラスを使うと、より柔軟にバリデーションを実行できます。
use Illuminate\Support\Facades\Validator;
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'comment' => 'required|string|max:1000',
], [
'comment.required' => 'コメントは必須です。',
'comment.string' => 'コメントは文字列である必要があります。',
'comment.max' => 'コメントは1000文字以内で入力してください。',
]);
if ($validator->fails()) {
return redirect()->back()
->withErrors($validator)
->withInput();
}
// バリデーション通過後の処理
}
4. Bladeテンプレートでのエラーメッセージ表示
エラーメッセージをリスト形式で表示するには、以下のように記述します。
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li class="_error-msg">{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
特定のフィールドに対するエラーメッセージを表示するには @error
ディレクティブを使用します。
@error('comment')
<div class="text-danger">{{ $message }}</div>
@enderror
5. 動的なフィールド名のバリデーション
name="comment-{{ $comment->id }}"
のように動的にフィールド名を設定した場合、バリデーションメッセージもそれに合わせる必要があります。
Controller側では、以下のように記述します。
$data = $request->validate([
'comment-' . $id => 'required|string|max:1000',
], [
'comment-' . $id . '.required' => 'コメントは必須です。',
'comment-' . $id . '.string' => 'コメントは文字列である必要があります。',
'comment-' . $id . '.max' => 'コメントは1000文字以内で入力してください。',
]);
Bladeテンプレート側では、エラー時に old
ヘルパーを使って値を保持します。
@foreach ($comments as $comment)
<textarea name="comment-{{ $comment->id }}">
{{ old('comment-' . $comment->id, 'comment-' . $comment->id) }}
</textarea>
@endforeach
old('comment-' . $comment->id, 'comment-' . $comment->id)
により、エラー時にはセッションの値を表示し、それ以外はデフォルト値を表示できます。
まとめ
本記事では、Laravelのバリデーションの基本と、Bladeテンプレートでのエラーメッセージの表示方法について解説しました。
-
Request
クラスを使う方法 - Controller内でバリデーションを行う方法
-
Validator
クラスの活用 -
old
ヘルパーでエラー時の入力保持 - 動的なフィールド名のバリデーション
これらの仕組みを理解することで、柔軟にフォームバリデーションを実装することが可能となります。