利用頻度の高いLaravelのバリデーションルールについてまとめました。「あまり知られていない便利なルール」や「意外な落とし穴」などあります。動作確認結果を参考にしながら上手に活用してみてください。
バリデーションルールの動作確認方法
Validatorクラスのmakeメソッドに、 検証データ
と ルール
を設定してインスタンスを生成します。
その後、 passesメソッド
を実行することで、バリデーションルールの動作確認ができます。
$data = ['parameter' => 100];
$rules1 = ['parameter' => 'integer'];
$rules2 = ['parameter' => 'string'];
\Validator::make($data, $rules1)->passes(); // true
\Validator::make($data, $rules2)->passes(); // false
上記例では、$rules1
に設定したルールの場合、バリデーションを通していることを確認できます。$rules2
に設定したルールの場合、バリデーションではじいていることを確認できます。
型判定
boolean|論理値
true
false
1
0
"1"
"0"
を通します。
$rules = ['parameter' => 'boolean'];
$data = ['parameter' => null];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => true];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => false];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 1];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 0];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 2];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => '1'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => '0'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 'A'];
\Validator::make($data, $rules)->passes(); // false
integer|整数値
整数を通します。小数( 1.5
など)は通しません。
$rules = ['parameter' => 'integer'];
$data = ['parameter' => null];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 1];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => -1];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => '1'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 'A'];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 1.5];
\Validator::make($data, $rules)->passes(); // false
numeric|数値
数値を通します。
$rules = ['parameter' => 'numeric'];
$data = ['parameter' => null];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 1];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => -1];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => '1'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 'A'];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 1.5];
\Validator::make($data, $rules)->passes(); // true
string|文字列
文字列を通します。
$rules = ['parameter' => 'string'];
$data = ['parameter' => null];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 1];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => '1'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 'ABC'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 'あいうえお'];
\Validator::make($data, $rules)->passes(); // true
date|日付
PHPのstrtotime関数で解釈できる日付文字列を通します。
$rules = ['parameter' => 'date'];
$data = ['parameter' => null];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 1];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 'ABC'];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => '2018/01/01 10:30:30'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => '2018/01/01'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => '2018-01-01'];
\Validator::make($data, $rules)->passes(); // true
array|配列
配列を通します。
$rules = ['parameter' => 'array'];
$data = ['parameter' => null];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 1];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 'ABC'];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => [1, 2, 3]];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => ['field1' => 1, 'field2' => 2, 'field3' => 3]];
\Validator::make($data, $rules)->passes(); // true
ファイル判定
file|ファイル
アップロードに成功したファイルを通します。
$rules = ['parameter' => 'file'];
$data = ['parameter' => null];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 1];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 'ABC'];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Illuminate\Http\UploadedFile::fake()->create('dummy', 1024)];
\Validator::make($data, $rules)->passes(); // true
image|画像
画像ファイル( jpg
png
bmp
gif
svg
)を通します。
$rules = ['parameter' => 'image'];
$filename = 'dummy.jpg';
$data = ['parameter' => \Illuminate\Http\UploadedFile::fake()->create($filename, 1024)];
\Validator::make($data, $rules)->passes(); // true
$filename = 'dummy.png';
$data = ['parameter' => \Illuminate\Http\UploadedFile::fake()->create($filename, 1024)];
\Validator::make($data, $rules)->passes(); // true
$filename = 'dummy.gif';
$data = ['parameter' => \Illuminate\Http\UploadedFile::fake()->create($filename, 1024)];
\Validator::make($data, $rules)->passes(); // true
$filename = 'dummy.svg';
$data = ['parameter' => \Illuminate\Http\UploadedFile::fake()->create($filename, 1024)];
\Validator::make($data, $rules)->passes(); // true
$filename = 'dummy.txt';
$data = ['parameter' => \Illuminate\Http\UploadedFile::fake()->create($filename, 1024)];
\Validator::make($data, $rules)->passes(); // false
$filename = 'dummy.csv';
$data = ['parameter' => \Illuminate\Http\UploadedFile::fake()->create($filename, 1024)];
\Validator::make($data, $rules)->passes(); // false
mimes:foo,bar,…|拡張子指定
指定した拡張子のファイルを通します。
$rules = ['parameter' => 'mimes:jpeg,txt'];
$filename = 'dummy.jpg';
$data = ['parameter' => \Illuminate\Http\UploadedFile::fake()->create($filename, 1024)];
\Validator::make($data, $rules)->passes(); // true
$filename = 'dummy.png';
$data = ['parameter' => \Illuminate\Http\UploadedFile::fake()->create($filename, 1024)];
\Validator::make($data, $rules)->passes(); // false
$filename = 'dummy.gif';
$data = ['parameter' => \Illuminate\Http\UploadedFile::fake()->create($filename, 1024)];
\Validator::make($data, $rules)->passes(); // false
$filename = 'dummy.svg';
$data = ['parameter' => \Illuminate\Http\UploadedFile::fake()->create($filename, 1024)];
\Validator::make($data, $rules)->passes(); // false
$filename = 'dummy.txt';
$data = ['parameter' => \Illuminate\Http\UploadedFile::fake()->create($filename, 1024)];
\Validator::make($data, $rules)->passes(); // true
$filename = 'dummy.csv';
$data = ['parameter' => \Illuminate\Http\UploadedFile::fake()->create($filename, 1024)];
\Validator::make($data, $rules)->passes(); // false
指定可能な拡張子一覧
https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
内容判定
email|有効なメールアドレス
有効なメールアドレスを通します。
$rules = ['parameter' => 'email'];
$data = ['parameter' => null];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 1];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 'ABC'];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 'abc@domain.com'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 'abc@domain'];
\Validator::make($data, $rules)->passes(); // false
// @前のドットはRFCで禁止されている
$data = ['parameter' => 'abc.@domain.com'];
\Validator::make($data, $rules)->passe(); // false
$data = ['parameter' => 'ab.c@domain.com'];
\Validator::make($data, $rules)->passes(); // true
// 2個以上のドットはRFCで禁止されている
$data = ['parameter' => 'ab..c@domain.com'];
\Validator::make($data, $rules)->passes(); // false
url|有効なURL
有効なURLを通します。
$rules = ['parameter' => 'url'];
$data = ['parameter' => null];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 1];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 'ABC'];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 'www.wakuwakubank.com'];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 'http://'];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 'http://w'];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 'http://ww'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 'http://www'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 'http://www.wakuwakubank'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 'http://www.wakuwakubank.com'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 'https://www.wakuwakubank.com'];
\Validator::make($data, $rules)->passes(); // true
alpha|アルファベット文字
全てアルファベット文字であれば通します。
$rules = ['parameter' => 'alpha'];
$data = ['parameter' => null];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 1];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => '1'];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 'ABC'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 'abc'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 'あいうえお'];
\Validator::make($data, $rules)->passes(); // true
[注意] マルチバイト文字も通してしまう
alpha系ルールには注意が必要です。マルチバイト文字も受け付けてしまいます。
半角英字のみに制限したいのであれば、正規表現を利用しましょう。
$rules = ['parameter' => 'regex:/^[a-zA-Z]+$/'];
$data = ['parameter' => 'ABC'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 'abc'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 'あいうえお'];
\Validator::make($data, $rules)->passes(); // false
digits:値|桁数
数値であり、かつ、指定した桁数であれば通します。
郵便番号の桁数をチェックしたいときなどに活用できます。
$rules = ['parameter' => 'digits:5'];
$data = ['parameter' => null];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 1];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 11111];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => '1'];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => '11111'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 'abcde'];
\Validator::make($data, $rules)->passes(); // false
digits_between:最小値,最大値|桁数
数値であり、かつ、指定した桁数の範囲内であれば通します。
$rules = ['parameter' => 'digits_between:5,7'];
$data = ['parameter' => null];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 1111];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 11111];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 1111111];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 11111111];
\Validator::make($data, $rules)->passes(); // false
date_format:フォーマット
指定した日付フォーマットと一致すれば通します。
$rules = ['parameter' => 'date_format:Y/m/d'];
$data = ['parameter' => '2018/01/01'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => '2018-01-01'];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => '2018/01/01 10:35:30'];
\Validator::make($data, $rules)->passes(); // false
$rules = ['parameter' => 'date_format:Y-m-d'];
$data = ['parameter' => '2018/01/01'];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => '2018-01-01'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => '2018-01-01 10:35:30'];
\Validator::make($data, $rules)->passes(); // false
$rules = ['parameter' => 'date_format:Y/m/d h:i:s'];
$data = ['parameter' => '2018/01/01'];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => '2018-01-01'];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => '2018/01/01 10:35:30'];
\Validator::make($data, $rules)->passes(); // true
regex:正規表現
指定した正規表現に一致すれば通します。
$rules = ['parameter' => 'regex:/^[a-zA-Z0-9]+$/'];
$data = ['parameter' => null];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 1111];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 'abcABC123'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 'abcABC123あいう'];
\Validator::make($data, $rules)->passes(); // false
日付比較
date_equals:日付
指定した日付と同じであれば通します。日付には日付文字列( today
など)を利用できます。
$rules = ['parameter' => 'date_equals:today'];
$data = ['parameter' => \Carbon\Carbon::yesterday()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::today()];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => \Carbon\Carbon::now()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::tomorrow()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::today()->addMonth()];
\Validator::make($data, $rules)->passes(); // false
$rules = ['parameter' => 'date_equals:now'];
$data = ['parameter' => \Carbon\Carbon::yesterday()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::today()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::now()];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => \Carbon\Carbon::tomorrow()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::today()->addMonth()];
\Validator::make($data, $rules)->passes(); // false
$rules = ['parameter' => 'date_equals:tomorrow'];
$data = ['parameter' => \Carbon\Carbon::yesterday()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::today()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::now()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::tomorrow()];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => \Carbon\Carbon::today()->addMonth()];
\Validator::make($data, $rules)->passes(); // false
// 今月末
$rules = ['parameter' => 'date_equals:last day of now'];
$data = ['parameter' => \Carbon\Carbon::yesterday()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::today()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::now()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::tomorrow()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::today()->addMonth()];
\Validator::make($data, $rules)->passes(); // false
after:日付
指定した日付より後であれば通します。
$rules = ['parameter' => 'after:today'];
$data = ['parameter' => \Carbon\Carbon::yesterday()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::today()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::now()];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => \Carbon\Carbon::tomorrow()];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => \Carbon\Carbon::today()->addMonth()];
\Validator::make($data, $rules)->passes(); // true
$rules = ['parameter' => 'after:now'];
$data = ['parameter' => \Carbon\Carbon::yesterday()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::today()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::now()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::tomorrow()];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => \Carbon\Carbon::today()->addMonth()];
\Validator::make($data, $rules)->passes(); // true
$rules = ['parameter' => 'after:tomorrow'];
$data = ['parameter' => \Carbon\Carbon::yesterday()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::today()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::now()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::tomorrow()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::today()->addMonth()];
\Validator::make($data, $rules)->passes(); // true
// 今月末
$rules = ['parameter' => 'after:last day of now'];
$data = ['parameter' => \Carbon\Carbon::yesterday()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::today()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::now()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::tomorrow()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::today()->addMonth()];
\Validator::make($data, $rules)->passes(); // true
after_or_equal:日付
指定した日付より後、または、同じであれば通します。
before:日付
指定した日付より前であれば通します。
$rules = ['parameter' => 'before:today'];
$data = ['parameter' => \Carbon\Carbon::yesterday()];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => \Carbon\Carbon::today()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::now()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::tomorrow()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::today()->addMonth()];
\Validator::make($data, $rules)->passes(); // false
$rules = ['parameter' => 'before:now'];
$data = ['parameter' => \Carbon\Carbon::yesterday()];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => \Carbon\Carbon::today()];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => \Carbon\Carbon::now()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::tomorrow()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::today()->addMonth()];
\Validator::make($data, $rules)->passes(); // false
$rules = ['parameter' => 'before:tomorrow'];
$data = ['parameter' => \Carbon\Carbon::yesterday()];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => \Carbon\Carbon::today()];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => \Carbon\Carbon::now()];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => \Carbon\Carbon::tomorrow()];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Carbon\Carbon::today()->addMonth()];
\Validator::make($data, $rules)->passes(); // false
// 今月末
$rules = ['parameter' => 'before:last day of now'];
$data = ['parameter' => \Carbon\Carbon::yesterday()];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => \Carbon\Carbon::today()];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => \Carbon\Carbon::now()];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => \Carbon\Carbon::tomorrow()];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => \Carbon\Carbon::today()->addMonth()];
\Validator::make($data, $rules)->passes(); // false
before_or_equal:日付
指定した日付より前、または、同じであれば通します。
許可/拒否リスト
in:foo,bar…|Rule::in
許可する値のリストを指定できます。 in:foo,bar…
の記述でも書けますが、 Rule::inメソッド
を利用するほうが実用的です。以下のように、配列変数をそのまま利用するケースが多いためです。
$colors = ['red', 'blue', 'green'];
$rules = ['parameter' => \Illuminate\Validation\Rule::in($colors)];
$data = ['parameter' => null];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 'red'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 'black'];
\Validator::make($data, $rules)->passes(); // false
$colors = [
1 => 'red',
2 => 'blue',
3 => 'green',
999 => 'other',
];
$rules = ['parameter' => \Illuminate\Validation\Rule::in(array_keys($colors))];
$data = ['parameter' => null];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 1];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 999];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 4];
\Validator::make($data, $rules)->passes(); // false
not_in:foo,bar,…|Rule::notIn
拒否する値のリストを指定できます。こちらも、 Rule::notInメソッド
を利用するのが実用的です。
サイズ|文字列、数値、配列、ファイル
サイズを判定するルールについて解説します。判定内容は、判定対象によって異なります。
対象 | 判定内容 |
---|---|
文字列 | 文字長 |
数値 | 整数値 |
配列 | 要素数 |
ファイル | キロバイト数 |
size:値|同じであること
指定したサイズと同じサイズであれば通します。
文字列の場合
$rules = ['parameter' => 'size:5'];
$data = ['parameter' => 'abcd'];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 'abcde'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 'abcdef'];
\Validator::make($data, $rules)->passes(); // false
値の場合(NG例)
$rules = ['parameter' => 'size:5'];
$data = ['parameter' => 4];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 5];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 6];
\Validator::make($data, $rules)->passes(); // false
全て false
になっています。 size:5だけ
をルールに指定している場合、文字数で判定されてしまいます。
値の場合(OK例)
$rules = ['parameter' => 'numeric|size:5'];
$data = ['parameter' => 4];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 5];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 6];
\Validator::make($data, $rules)->passes(); // false
numeric
もルールに追加すると、値の大きさで判定してくれます。
配列の場合
$rules = ['parameter' => 'size:5'];
$data = ['parameter' => [1,2,3,4]];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => [1,2,3,4,5]];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => [1,2,3,4,5,6]];
\Validator::make($data, $rules)->passes(); // false
ファイルの場合
$sizeKB = 1024;
$rules = ['parameter' => 'size:' . $sizeKB];
$data = ['parameter' => \Illuminate\Http\UploadedFile::fake()->create('dummy', 1023)];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => \Illuminate\Http\UploadedFile::fake()->create('dummy', 1024)];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => \Illuminate\Http\UploadedFile::fake()->create('dummy', 1025)];
\Validator::make($data, $rules)->passes(); // false
max:値|以下であること
指定したサイズ以下であれば通します。
min:値|以上であること
指定したサイズ以上であれば通します。
between:min,max|範囲内であること
指定したサイズ範囲内であれば通します。
入力有無
nullable|null値を許可
$rules = ['parameter' => 'string'];
$data = ['parameter' => null];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 'abcdef'];
\Validator::make($data, $rules)->passes(); // true
nullの場合、falseになっています。nullも許可したい場合、 nullableルール
を追加で設定する必要があります。
$rules = ['parameter' => 'nullable|string'];
$data = ['parameter' => null];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => 'abcdef'];
\Validator::make($data, $rules)->passes(); // true
空文字のリクエストデータは、Middlewareの ConvertEmptyStringsToNull
によって null
に変換されます。そのため、任意入力項目は検証時に null
で送られてくる可能性が高いです。その際、nullableルール
を設定しておらず、意図しないバリデーションエラーになりがちです。 nullableルール
の設定忘れに注意しましょう。
required|入力必須
指定フィールドが存在し、かつ空でなければ通します。
$rules = ['parameter' => 'required'];
// パラメータが存在しない
$data = [];
\Validator::make($data, $rules)->passes(); // false
// パラメータが存在するがnullである
$data = ['parameter' => null];
\Validator::make($data, $rules)->passes(); // false
// パラメータが存在するが空文字である
$data = ['parameter' => ''];
\Validator::make($data, $rules)->passes(); // false
// パラメータが存在するが空配列である
$data = ['parameter' => []];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 'abc'];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter' => [1, 2]];
\Validator::make($data, $rules)->passes(); // true
他のフィールドと連携
confirmed|同じであることを確認
_confirmation
をつけた他のフィールドと値が同じであれば通します。
$rules = ['parameter' => 'confirmed'];
$data = ['parameter' => 'aaa', 'parameter_confirmation' => 'bbb'];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter' => 'aaa', 'parameter_confirmation' => 'aaa'];
\Validator::make($data, $rules)->passes(); // true
パスワード確認用の入力で活用できます。ただ、 登録フォームにおけるパスワード確認用の入力欄は必要か | UX MILK という意見もあり、利用ケースは減っていくものと考えています。
required_if:他のフィールド,値,…
指定した他のフィールド
が 指定の値
であれば、入力必須になります。
$rules = ['parameter_a' => 'required_if:parameter_b,10'];
// parameter_bが10なのに、parameter_aが入力されていないためNG
$data = ['parameter_a' => null, 'parameter_b' => 10];
\Validator::make($data, $rules)->passes(); // false
// parameter_bが11のため、parameter_aが入力されていなくてもOK
$data = ['parameter_a' => null, 'parameter_b' => 11];
\Validator::make($data, $rules)->passes(); // true
// parameter_bが10だが、parameter_aが入力されているのでOK
$data = ['parameter_a' => 'aaa', 'parameter_b' => 10];
\Validator::make($data, $rules)->passes(); // true
required_unless:他のフィールド,値,…
指定した他のフィールド
が 指定の値
に一致しなければ、入力必須になります。
$rules = ['parameter_a' => 'required_unless:parameter_b,10'];
$data = ['parameter_a' => null, 'parameter_b' => 10];
\Validator::make($data, $rules)->passes(); // true
$data = ['parameter_a' => null, 'parameter_b' => 11];
\Validator::make($data, $rules)->passes(); // false
$data = ['parameter_a' => 'aaa', 'parameter_b' => 11];
\Validator::make($data, $rules)->passes(); // true
required_with:foo,bar,…
指定した他のフィールド
の どれか1つでも存在している
場合、入力必須になります。
$rules = ['a' => 'required_with:b,c'];
$data = ['a' => null];
\Validator::make($data, $rules)->passes(); // true
$data = ['a' => null, 'b' => 'bbb'];
\Validator::make($data, $rules)->passes(); // false
$data = ['a' => 'aaa', 'b' => 'bbb'];
\Validator::make($data, $rules)->passes(); // true
required_with_all:foo,bar,…
指定した他のフィールド
が 全て存在している
場合、入力必須になります。
$rules = ['a' => 'required_with_all:b,c'];
$data = ['a' => null];
\Validator::make($data, $rules)->passes(); // true
$data = ['a' => null, 'b' => 'bbb'];
\Validator::make($data, $rules)->passes(); // true
$data = ['a' => 'aaa', 'b' => 'bbb'];
\Validator::make($data, $rules)->passes(); // true
$data = ['a' => null, 'b' => 'bbb', 'c' => 'ccc'];
\Validator::make($data, $rules)->passes(); // false
$data = ['a' => 'aaa', 'b' => 'bbb', 'c' => 'ccc'];
\Validator::make($data, $rules)->passes(); // true
required_without:foo,bar,…
指定した他のフィールド
の どれか1つでも存在しない
場合、入力必須になります。
required_without_all:foo,bar,…
指定した他のフィールド
が 全て存在しない
場合、入力必須になります。
DB連携
exists:テーブル,カラム
DBに指定条件で該当するレコードが存在すれば通します。
$rules = ['user_id' => 'exists:users,id'];
$data = ['user_id' => 1];
// 「usersテーブル」の「idカラムのデータ」に同一値が存在すれば通す
\Validator::make($data, $rules)->passes();
条件を追加したい場合、 Rule::existsメソッド
を利用します。
$rules = ['user_id' => \Illuminate\Validation\Rule::exists('users', 'id')->where(function ($query) {
$query->where('created_at', '>=', '2018-01-01');
})];
$data = ['user_id' => 1];
// 「usersテーブル」にて、
// 「created_atが2018-01-01以降」で、
// かつ 「idカラムのデータ」に同一値が存在すれば通す
\Validator::make($data, $rules)->passes();
unique:テーブル,カラム,除外ID,IDカラム
DBに指定条件で重複するレコードが存在しなければ通します。
ユーザー新規登録などの場合
$rules = ['user_email' => 'unique:users,email'];
$data = ['user_email' => 'xxx@xxx.com'];
// 「usersテーブル」の「emailカラムのデータ」に同一値が存在しなければ通します
\Validator::make($data, $rules)->passes();
ユーザー情報更新などの場合
ユーザー情報更新などのケースでは、更新ユーザー自身のレコードを除外した状態で、重複チェックする必要があります。その場合、以下のように指定します。
$userId = 10;
$rules = ['user_email' => 'unique:users,email,' . $userId . ',id'];
$data = ['user_email' => 'xxx@xxx.com'];
// 「usersテーブル」にて、
// 「idカラムが10以外」で、
// 「emailカラムのデータ」に同一値が存在しなければ通します
\Validator::make($data, $rules)->passes();
さらに条件を付け加えたい場合
条件を追加したい場合、 Rule::uniqueメソッド
を利用します。
$userId = 10;
$rules = [
'user_email' => \Illuminate\Validation\Rule::unique('users', 'id')
->ignore($userId, 'user_id')
->where(function ($query) {
$query->where('created_at', '>=', '2018-01-01');
})
];
$data = ['user_id' => 1];
// 「usersテーブル」にて、
// 「idカラムが10以外」で、
// かつ 「created_atが2018-01-01以降」で、
// かつ 「emailカラムのデータ」に同一値が存在しなければ通します
\Validator::make($data, $rules)->passes();