Laravel7 で入力値そのものと入力値を分割した配列の両方を一度にバリデーションするためのルールの書き方 – oki2a24 を改善する話です。
ルールオブジェクトまとめ
公式ドキュメントに書いてあること
- ルールオブジェクトの使用 – カスタムバリデーションルールのメソッドを定義
php artisan make:rule <name>
コマンドでapp/Rules
ディレクトリに新しいルールオブジェクトのファイルを生成できる。passes($attribute, $value)
メソッドでバリデーションを行う。$attribute
: フォームの属性名$value
: フォームに入力された属性値。これをバリデーションすることになる。
- フォームリクエストクラスの
rule
メソッでのルールオブジェクトの使用方法は、ルールを書く場所にインスタンス化すれば良い。そのため、ルールを書く際は文字列を|
で区切るのではなく、配列で定義することになる。
公式ドキュメントに書いてないこと (こちらを本ページで扱う)
- クロージャの使用 – カスタムバリデーションルールのメソッドを定義 のみを使う場合、カスタムバリデーションルールが 2 つ以上になるとテスト時にどのクロージャがテストに該当するのかわからなくなる。そのため、クロージャを利用せずにルールオブジェクトのみを使うのも良いと思う。
- どうやらルールオブジェクトは 1 回のバリデーションで使ったオブジェクトをそのままエラーメッセージ出力時でも使うようだ。したがって、ルールオブジェクトクラスのコンストラクタやプロパティ (クラスのメンバ変数) を使って応用を効かせることができる。
passes
メソッドで$attribute
と$value
以外の値を使いたい (例えばバリデーション時の判定に使う最大数とか) 場合は、ルールオブジェクトのコンストラクタで渡す。message
メソッドで例えばpasses
メソッド内で出てきた値を使いたい場合は、passes
メソッド内からプロパティに渡してやればよい。