開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. PHP >
  4. Laravel >
  5. Laravelのカスタムバリデーション用インターフェース ValidatorAwareRuleを使ってみた
no-image

Laravelのカスタムバリデーション用インターフェース ValidatorAwareRuleを使ってみた

初めまして、たけちゃんです。
今年の3月に入社してから初めての投稿となります。
主にLaravelを使用したバックエンド開発に携わらせて頂いています。
今日はLaravelのカスタムバリデーションルール用のインターフェースValidatorAwareRuleについて紹介したいと思います!
 

前提条件

  • Laravel Framework 10.x
  • PHP 8.2

 

はじめに

Laravelには様々なバリデーションルールが用意されていますが、時には自分でカスタムしたい場合もあるかと思います。
カスタムバリデーションルールはIlluminate\Contracts\Validation\ValidationRuleというインターフェースを利用して簡単に実装することができますが、今回はValidatorAwareRuleを使った少しトリッキーな例をご紹介します。
尚、Laravel 10.xではIlluminate\Contracts\Validation\RuleクラスはIlluminate\Contracts\Validation\ValidationRuleに移行されています。
ValidatorAwareRuleはGithubリポジトリに詳しく記載されていますので合わせて参照ください。

ValidatorAwareRuleはRuleクラスの定義の中でValidatorを直接利用したい場合に使用できます。
例えば先日Illuminate\Validation\Rules\Passwordを利用して独自のパスワードルールを作る機会があったのですが、このPasswordクラスでもValidatorAwareRuleが実装されており、自分で作成した独自ルールと組み合わせて実装しました。
実際のコードを以下に示しながら使い方を解説します。
 

コード例

コード例は以下のようになります。

$rules = ['password' => new Password()];

use Illuminate\Validation\Rules\Password as PasswordRule;

class Password implements ValidationRule, ValidatorAwareRule, DataAwareRule
{
    private PasswordRule $passwordRule;

    public function __construct()
    {
        $this->passwordRule = PasswordRule::min(8);
    }

    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        if (
            !is_string($value) ||
            !$this->passwordRule->passes($attribute, $value)
        ) {
            $fail($this->messageWhenValueDoesNotMatchRegex());
        }
    }

    public function setValidator(Validator $validator): static
    {
        $this->passwordRule->setValidator($validator);
        return $this;
    }

    private function messageWhenValueDoesNotMatchRegex(): string
    {
        return ':attributeには8文字以上で入力してください。';
    }
}
​このクラスは、既存のPasswordクラスを活用して独自のバリデーションルールを作成しています。
便宜上既存のPasswordクラスはPasswordRuleとしています。

このクラスの中で値が文字列であることの検証に加えてPasswordRuleクラスのpasses()メソッドを利用したかったので、setValidator()メソッドを定義し、その中でPasswordRuleクラスのsetValidatorメソッドを呼び出してValidatorを設定しています。
これによってフレームワークによって自動的にsetValidator()メソッドが呼び出され、Validatorのインスタンスを使用することができます。

また、今回は使用していませんがDataAwareRuleというインターフェースもあり、setData()メソッドによってバリデーション対象の全データを利用することができます。
他のフィールドの値に応じて判定条件を変える時などに便利です。
参考URLに好例が紹介されていますので合わせてご覧頂けると幸いです。

今回はValidatorAwareRule、ValidationRuleを実装したカスタムルールクラスの作り方についてご紹介しました。
既存のRuleクラスを活用して独自のバリデーションルールを作成したい場合などにご活用頂ければと思います!
 

参考URL:

  • posted by たけちゃん
  • Laravel
TOPに戻る