目次
validate() メソッドを使用したシンプルな場合
// バリデーションを実行(コントローラー)
public function store(Request $request)
{
// バリデーションを実行
$validated = $request->validate([
'title' => 'required|max:255',
]);
// バリデーション失敗時、ここは実行されない
// 自動的に前のページへリダイレクトされる
}
- バリデーション失敗
- エラーメッセージがセッションに一時保存される
- 前のページへ自動リダイレクト
- リダイレクト先のビューで$errors変数が自動的に利用可能になる
rules()メソッドで「フォームリクエスト」を作成してコントローラーから分離
validateメソッド使用する場合と異なり、コントローラー内でのバリデーション実行ではなく、コントローラーメソッド実行前の呼び出し時に行われます
FormRequest継承して独自のクラスを作成して、そのクラス内のrules()で定義したバリデーションルールを「タイプヒントだけで自動実行」される仕組みです
// app/Http/Requests/ValidationTestRequest.php
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ValidationTestRequest extends FormRequest
{
public function rules(): array
{
return [
'username' => 'required|max:20',
'age' => 'required|integer|min:1|max:120',
];
}
public function messages(): array
{
return [
'username.required' => 'ユーザー名は必須です',
'age.required' => '年齢は必須です',
'age.min' => '年齢は1以上で入力してください',
];
}
}- rule()で各フィールドの検証ルールを定義
- messages()でエラーメッセージの内容を定義
<form method="POST" action="/validation-test">
@csrf
<p>ユーザー名: <input type="text" name="username" value="{{ old('username') }}"></p>
@error('username')
<span style="color:red;">{{ $message }}</span>
@enderror
<p>年齢: <input type="number" name="age" value="{{ old('age') }}"></p>
@error('age')
<span style="color:red;">{{ $message }}</span>
@enderror
<button type="submit">送信</button>
</form>上記のようなビューファイルの画面にリダイレクトした際にエラーの内容を表示てできるのは、検証画面のネットワークタブのPOSTのレスポンスヘッダーを見ると確認できるかと思いますが、laravel_sessionからエラーを取得できるようです
set-cookie laravel_session=暗号化されたエラー