【保存版】バリデーションルールのまとめ

利用頻度の高い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例)

numeric もルールに追加すると、値の大きさで判定してくれます。

$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

配列の場合

$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();
わくわくBank.
技術系の記事を中心に、役に立つと思ったこと、整理したい情報などを掲載しています。