Laravelのカスタムバリデーション用インターフェース ValidatorAwareRuleを使ってみた
初めまして、たけちゃんです。
今年の3月に入社してから初めての投稿となります。
主にLaravelを使用したバックエンド開発に携わらせて頂いています。
今日はLaravelのカスタムバリデーションルール用のインターフェースValidatorAwareRuleについて紹介したいと思います!
カスタムバリデーションルールは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が実装されており、自分で作成した独自ルールと組み合わせて実装しました。
実際のコードを以下に示しながら使い方を解説します。
便宜上既存のPasswordクラスはPasswordRuleとしています。
このクラスの中で値が文字列であることの検証に加えてPasswordRuleクラスのpasses()メソッドを利用したかったので、setValidator()メソッドを定義し、その中でPasswordRuleクラスのsetValidatorメソッドを呼び出してValidatorを設定しています。
これによってフレームワークによって自動的にsetValidator()メソッドが呼び出され、Validatorのインスタンスを使用することができます。
また、今回は使用していませんがDataAwareRuleというインターフェースもあり、setData()メソッドによってバリデーション対象の全データを利用することができます。
他のフィールドの値に応じて判定条件を変える時などに便利です。
参考URLに好例が紹介されていますので合わせてご覧頂けると幸いです。
今回はValidatorAwareRule、ValidationRuleを実装したカスタムルールクラスの作り方についてご紹介しました。
既存のRuleクラスを活用して独自のバリデーションルールを作成したい場合などにご活用頂ければと思います!
今年の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:
- Laravelドキュメント バリデーション(https://readouble.com/laravel/10.x/ja/validation.html)
- Laravel 8 カスタムルール用のインターフェース DataAwareRule と ValidatorAwareRule で戯れてみる(https://zenn.dev/nshiro/articles/f4129e4142d56b)