🙄

[備忘録]Laravelのバリデーション関連のメソッドの整理

に公開

Laravelのバリデーション関連のメソッドって多くないですか?
今回は各メソッドの役割と、メソッドが呼ばれる順番を整理してみます。
(Laravel12のドキュメントを参考にしました)
ただそれだけの記事です😉

各メソッドの役割

validate()

基本バリデーションをチェックしたいときに使用する。
バリデーションルールの配列を渡すと、それらに応じてリクエストデータをチェックしてくれる。

$validated = $request->validate([
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);

rules()

バリデーションルールを返すメソッド。
このメソッドをオーバライドしてルールを定義しておけば、Laravelが裏で自動で呼び出して処理してくれる。

public function rules(): array
{
    return [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ];
}

after()

validate()によるバリデーションチェックが完了した後に追加でチェックしたい場合に使用する。

$validator->after(function ($validator) {
    if ($this->somethingElseIsInvalid()) {
        $validator->errors()->add(
            'field', 'Something is wrong with this field!'
        );
    }
});

withValidator()

after()のバリデーションフックを追加する場合に使用する。

public function withValidator($validator)
{
    $validator->after(function ($validator) {
        if ($this->somethingElseIsInvalid()) {
            $validator->errors()->add('field', 'Something is wrong with this field!');
        }
    });
}

Laravel11にもこのメソッドは存在しているけど、ドキュメントには記載なかったためLaravel8のドキュメントを参考にしました

getValidatorInstance()

validatorのインスタンスを作成し、リクエストクラスのプロパティにセットする。
ここでwithValidatorが呼ばれる。

prepareForValidation()

バリデーションチェックをするにデータを加工したい場合に使用する。

protected function prepareForValidation(): void
{
    $this->merge([
        'slug' => Str::slug($this->slug),
    ]);
}

passedValidation()

バリデーションチェックをしたにデータを加工したい場合に使用する。

protected function passedValidation(): void
{
    $this->replace(['name' => 'Taylor']);
}

failedValidation()

バリデーションチェックが失敗した場合に実行される。
バリデーションエラー時の処理をカスタマイズしたいときに使用する。

protected function failedValidation(Validator $validator):  HttpResponseException
{
    throw new HttpResponseException(
        response()->badRequest(
            $validator->errors()->toArray(),
        )
    );
}

validated()

バリデーションチェック済みのリクエストデータを取得したいときに使用する。

$validated = $request->validated();

safe()

validated()と同じような役割。
safe()->only()safe()->all()のようにしてバリデーションチェック済みのデータのサブセットや全体を取得することができる。

$validated = $request->safe()->only(['name', 'email']);

メソッドの呼び出し順

  1. prepareForValidation
  2. getValidatorInstance
  3. rules
  4. withValidator
  5. passedValidation

参考

Discussion