Laravelバリデーション

目次

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=暗号化されたエラー

参考

https://readouble.com/laravel/10.x/ja/validation.html

目次