A Laravel(バリデーション) - user000422/0 GitHub Wiki

基本情報

公式: https://readouble.com/laravel/11.x/ja/validation.html 標準のvalidateメソッドを使う方法は応用が全く効かないので非推奨。 全部フォームリクエストでいいじゃんと思うでしょ?GETに対応してない時点で論外なのよ。POSTは良いと思う。

バリデーションルール

maxは半角1文字も全角1文字も「1」としてカウント。

実践

Validatorファサード型。makeメソッドで自由な処理が可能。

// 参考書式
use Illuminate\Support\Facades\Validator;

public function store(Request $request)
{
    // バリデーションルールの定義
    $rules = [
        'name' => 'required|max:20',
        'email' => 'required|email|max:255',
        'age' => 'integer',
        'title' => 'required|unique:posts|max:255',
        'publish_at' => 'nullable|date',
    ];

    // バリデータインスタンスでバリデーションを実施
    $validator = Validator::make($request->all(), $rules);

    // バリデーション失敗
    if ($validator->fails()) {
        // TODO
    }

    // バリデーション済みデータの取得
    $validated = $validator->validated();
}

Request(フォームリクエストバリデーション)

Controllerからバリデーション処理を分離(カプセル化する)目的。 バリデーションチェックを行う。 Controllerから呼び出される。 デフォルト状態で失敗すると403で直前の画面にリダイレクト。 ★POST用の仕組みのためGETに使わないことにする。GETで使えるようにするのは面倒すぎる。

public function authorize(): bool
{
    return true; // falseのままで使用するとエラー
}
public function rules()
{
    // required : 入力必須, nullable : 入力任意
    // numeric : 数字
    // max:num : 最大桁数
    // between:num_min,num_max : 桁数範囲指定
    return [
        'name' => 'required|max:16',
        'age'  => 'numeric|between:0,120',
        'name' => 'required|string|confirmed|min:8',
    ];
}

// エラーメッセージをカスタムする場合は「messages」をオーバーライド
public function messages()
{
    return [
        'name.required' => '名前は必須です。',
        'password.min' => 'パスワードは8桁以上です。',
    ];
}

// バリデーションエラー後のレスポンスをカスタム「」をオーバーライド
// 必須: use Illuminate\Contracts\Validation\Validator;
// 必須: use Illuminate\Http\Exceptions\HttpResponseException;
protected function failedValidation(Validator $validator)
{
    $response = response()->json([
        'status' => 'error',
        'message' => $validator->errors()
    ], 422);
    throw new HttpResponseException($response);
}

// ★GETのクエリパラメータをバリデーションしたい場合
public function validationData()
{
    $name = $this->query('name');
    return array_merge($this->all(), compact('name '));
}

Controllerにてフォームリクエストバリデーションの呼び出し設定。

use App\Http\Requests\SampleRequest;

public function sample(SampleRequest $request)
{
    // バリデーション済みデータの取得
    $validated = $request->validated();
    $email= $validated['email'];
}

viewでエラーメッセージを設定。

<!-- errorディレクティブ -->
@error('name')
<p>{{ $message }}</p> <!-- ここにエラーメッセージ 名称は「message」で固定 -->
@enderror

<!-- old : エラーによるリダイレクト前の入力値を保持する。 -->
<input type="text" value="{{ old('name') }}" name="name">

応用

■パラメータでバリデーションルールを分けたい

public function rules(): array
{
    $flg = e($this->input('flg'));

    // 共通
    $rules = [
        '' => '',
    ];

    // 分岐
    if ($flg) {
        $rules['color'] = 'required';
    }

    return $rules;
}