Laravel バリデーションについてまとめていくよ3(数値)

Laravel バリデーションについてまとめていくよ2(文字種編)に続いてlaravelのバリデーションをまとめていきます。
今回は、数値についてのバリデーションを確認します。

確認するルールはintegerdigitsdigits_betweenmax_digitsmin_digitsnumericdecimalmultiple_ofです。

integer | 整数

整数であることをチェックします。
Laravle公式のバリデーションのドキュメントに下記のように(翻訳済みです)あります。

この検証ルールは入力がinteger型であることを検証するものではなく、PHPのFILTER_VALIDATE_INTルールが受け付ける型であることを検証するものです。入力が数値であることを検証する必要がある場合は、このルールとnumericのルールを組み合わせて使用してください。

16進、8進、2進表記、マイナスも許容されます。
プラスの10進表記の整数のみを許容したい場合は後述のdigitsなどがよいかもしれません。
マイナスの10進表記も許容したい場合は、正規表現で-?[0-9]+のようにしたほうが良いかもしれません。

$rules = ['parameter' => 'integer'];

// リクエストにパラメーターが含まれていない
$data = [];
Validator::make($data, $rules)->passes(); // true

// null
$data = ['parameter' => null];
Validator::make($data, $rules)->passes(); // false

// 空文字
$data = ['parameter' => ''];
Validator::make($data, $rules)->passes(); // true

// 半角スペース
$data = ['parameter' => ' '];
Validator::make($data, $rules)->passes(); // false

// 空配列
$data = ['parameter' => []];
Validator::make($data, $rules)->passes(); // false

// アルファベット
$data = ['parameter' => 'a'];
Validator::make($data, $rules)->passes(); // false

// 全角文字
$data = ['parameter' => "1234"];
Validator::make($data, $rules)->passes(); // false

// 文字列
$data = ['parameter' => '1234'];
Validator::make($data, $rules)->passes(); // true

// マイナス
$data = ['parameter' => '-1234'];
Validator::make($data, $rules)->passes(); // true

// ゼロ
$data = ['parameter' => '0'];
Validator::make($data, $rules)->passes(); // true

// 符号付
$data = ['parameter' => '+1234'];
Validator::make($data, $rules)->passes(); // true

// 8進表記
$data = ['parameter' => '0123'];
Validator::make($data, $rules)->passes(); // true

// 8進表記
$data = ['parameter' => '0o123'];
Validator::make($data, $rules)->passes(); // true

// 16進表記
$data = ['parameter' => '0x1A'];
Validator::make($data, $rules)->passes(); // true

// 2進表記
$data = ['parameter' => '0b11111111'];
Validator::make($data, $rules)->passes(); // true

// PHP 7.4.0 以降
$data = ['parameter' => '1_234_567'];
Validator::make($data, $rules)->passes(); // true

// 小数
$data = ['parameter' => '0.1234'];
Validator::make($data, $rules)->passes(); // false

// 小数
$data = ['parameter' => '-0.1234'];
Validator::make($data, $rules)->passes(); // false

// 小数
$data = ['parameter' => '+0.1234'];
Validator::make($data, $rules)->passes(); // false

// 指数表記
$data = ['parameter' => '1e8'];
Validator::make($data, $rules)->passes(); // false

サンプルでは数字については文字列で記載していますが、数値型でも同様の結果となります。

Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L1287-L1297

PHPでの整数の定義は下記のようになっています。

decimal     : [1-9][0-9]*(_[0-9]+)*
            | 0

hexadecimal : 0[xX][0-9a-fA-F]+(_[0-9a-fA-F]+)*

octal       : 0[oO]?[0-7]+(_[0-7]+)*

binary      : 0[bB][01]+(_[01]+)*

integer     : decimal
            | hexadecimal
            | octal
            | binary

PHP: 整数 – Manual

digits | 整数(桁数指定)

プラスの整数であり、指定の桁数であることをチェックします。
ゼロ始まりも許容されるので、注意が必要です。

$rules = ['parameter' => 'digits:4'];

// リクエストにパラメーターが含まれていない
$data = [];
Validator::make($data, $rules)->passes(); // true

// null
$data = ['parameter' => null];
Validator::make($data, $rules)->passes(); // false

// 空文字
$data = ['parameter' => ''];
Validator::make($data, $rules)->passes(); // true

// 半角スペース
$data = ['parameter' => ' '];
Validator::make($data, $rules)->passes(); // true

// 空配列
$data = ['parameter' => []];
Validator::make($data, $rules)->passes(); // Exception(エラーになります)

// アルファベット
$data = ['parameter' => 'a'];
Validator::make($data, $rules)->passes(); // false

// 全角文字
$data = ['parameter' => "1234"];
Validator::make($data, $rules)->passes(); // false

// 文字列
$data = ['parameter' => '1234'];
Validator::make($data, $rules)->passes(); // true

// 文字列
$data = ['parameter' => '123'];
Validator::make($data, $rules)->passes(); // false

// 文字列
$data = ['parameter' => '12345'];
Validator::make($data, $rules)->passes(); // false

// マイナス
$data = ['parameter' => '-1234'];
Validator::make($data, $rules)->passes(); // false

// ゼロ
$data = ['parameter' => '0'];
Validator::make($data, $rules)->passes(); // false

// 符号付
$data = ['parameter' => '+1234'];
Validator::make($data, $rules)->passes(); // false

// 8進表記
$data = ['parameter' => '0123'];
Validator::make($data, $rules)->passes(); // true

// 8進表記
$data = ['parameter' => '0o123'];
Validator::make($data, $rules)->passes(); // false

// 16進表記
$data = ['parameter' => '0x1A'];
Validator::make($data, $rules)->passes(); // false

// 2進表記
$data = ['parameter' => '0b11111111'];
Validator::make($data, $rules)->passes(); // false

// PHP 7.4.0 以降
$data = ['parameter' => '1_234_567'];
Validator::make($data, $rules)->passes(); // false

// 小数
$data = ['parameter' => '0.1234'];
Validator::make($data, $rules)->passes(); // false

// 小数
$data = ['parameter' => '-0.1234'];
Validator::make($data, $rules)->passes(); // false

// 小数
$data = ['parameter' => '+0.1234'];
Validator::make($data, $rules)->passes(); // false

// 指数表記
$data = ['parameter' => '1e8'];
Validator::make($data, $rules)->passes(); // false

Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L612-L626

digits_between | 整数(桁数範囲指定)

digitsの桁数の範囲を指定してチェックします。
サンプルは大幅に省略します。

$rules = ['parameter' => 'digits_between:2,4'];

$data = ['parameter' => '1'];
Validator::make($data, $rules)->passes(); // false

$data = ['parameter' => '12'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '123'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '1234'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '1235'];
Validator::make($data, $rules)->passes(); // false

Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L628-L644

max_digits | 整数(最大桁数指定)

digitsの最大桁数を指定してチェックします。
サンプルは大幅に省略します。

$rules = ['parameter' => 'max_digits:3'];

$data = ['parameter' => '1'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '12'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '123'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '1234'];
Validator::make($data, $rules)->passes(); // false

$data = ['parameter' => '1235'];
Validator::make($data, $rules)->passes(); // false

Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L1388-L1403

min_digits | 整数(最低桁数指定)

digitsの最低桁数を指定してチェックします。
サンプルは大幅に省略します。

$rules = ['parameter' => 'min_digits:3'];

$data = ['parameter' => '1'];
Validator::make($data, $rules)->passes(); // false

$data = ['parameter' => '12'];
Validator::make($data, $rules)->passes(); // false

$data = ['parameter' => '123'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '1234'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '1235'];
Validator::make($data, $rules)->passes(); // true

Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L1490-L1505

numeric | 数値

is_numeric関数で数値であるかをチェックします。

$rules = ['parameter' => 'integer'];

// リクエストにパラメーターが含まれていない
$data = [];
Validator::make($data, $rules)->passes(); // true

// null
$data = ['parameter' => null];
Validator::make($data, $rules)->passes(); // false

// 空文字
$data = ['parameter' => ''];
Validator::make($data, $rules)->passes(); // true

// 半角スペース
$data = ['parameter' => ' '];
Validator::make($data, $rules)->passes(); // true

// 空配列
$data = ['parameter' => []];
Validator::make($data, $rules)->passes(); // false

// アルファベット
$data = ['parameter' => 'a'];
Validator::make($data, $rules)->passes(); // false

// 全角文字
$data = ['parameter' => "1234"];
Validator::make($data, $rules)->passes(); // false

// 文字列
$data = ['parameter' => '1234'];
Validator::make($data, $rules)->passes(); // true

// マイナス
$data = ['parameter' => '-1234'];
Validator::make($data, $rules)->passes(); // true

// ゼロ
$data = ['parameter' => '0'];
Validator::make($data, $rules)->passes(); // true

// 符号付
$data = ['parameter' => '+1234'];
Validator::make($data, $rules)->passes(); // true

// 8進表記
$data = ['parameter' => '0123'];
Validator::make($data, $rules)->passes(); // true

// 8進表記
$data = ['parameter' => '0o123'];
Validator::make($data, $rules)->passes(); // false

// 16進表記
$data = ['parameter' => '0x1A'];
Validator::make($data, $rules)->passes(); // false

// 2進表記
$data = ['parameter' => '0b11111111'];
Validator::make($data, $rules)->passes(); // false

// PHP 7.4.0 以降
$data = ['parameter' => '1_234_567'];
Validator::make($data, $rules)->passes(); // false

// 小数
$data = ['parameter' => '0.1234'];
Validator::make($data, $rules)->passes(); // true

// 小数
$data = ['parameter' => '-0.1234'];
Validator::make($data, $rules)->passes(); // true

// 小数
$data = ['parameter' => '+0.1234'];
Validator::make($data, $rules)->passes(); // true

// 指数表記
$data = ['parameter' => '1e8'];
Validator::make($data, $rules)->passes(); // true

Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L1555-L1565

PHPでの数値形式の定義は下記のようになっています。

WHITESPACES      \s*
LNUM             [0-9]+
DNUM             ([0-9]*)[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM    (({LNUM} | {DNUM}) [eE][+-]? {LNUM})
INT_NUM_STRING   {WHITESPACES} [+-]? {LNUM} {WHITESPACES}
FLOAT_NUM_STRING {WHITESPACES} [+-]? {EXPONENT_DNUM} {WHITESPACES}
NUM_STRING       ({INT_NUM_STRING} | {FLOAT_NUM_STRING})

PHP: 数値形式の文字列 – Manual

decimal | 数値(小数桁数指定)

上述のnumericルールにマッチし、小数点以下の桁数が指定桁数かのチェックをします。
引数を1つのみ指定した場合、小数点以下の桁数が一致することをチェックします。
引数を2つ指定した場合は、小数点以下の桁数の範囲を指定します。

引数を1つのみ指定した場合

$rules = ['parameter' => 'decimal:2'];

$data = ['parameter' => '1.2'];
Validator::make($data, $rules)->passes(); // false

$data = ['parameter' => '1.23'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '1.234'];
Validator::make($data, $rules)->passes(); // false

引数を2つ指定した場合

$rules = ['parameter' => 'decimal:2,3'];

$data = ['parameter' => '1.2'];
Validator::make($data, $rules)->passes(); // false

$data = ['parameter' => '1.23'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '1.234'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '1.2345'];
Validator::make($data, $rules)->passes(); // false

Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L557-L585

multiple_of | 倍数

入力値が指定された数値の倍数であるかをチェックする。
サンプルは3としましたが、0.3などの小数も設定できます。

$rules = ['parameter' => 'multiple_of:3'];

// リクエストにパラメーターが含まれていない
$data = [];
Validator::make($data, $rules)->passes(); // true

// null
$data = ['parameter' => null];
Validator::make($data, $rules)->passes(); // false

// 空文字
$data = ['parameter' => ''];
Validator::make($data, $rules)->passes(); // true

// 半角スペース
$data = ['parameter' => ' '];
Validator::make($data, $rules)->passes(); // true

// 空配列
$data = ['parameter' => []];
Validator::make($data, $rules)->passes(); // false

// 指数表記
$data = ['parameter' => '1e8'];
Validator::make($data, $rules)->passes(); // Exception(エラーになります)

// アルファベット
$data = ['parameter' => 'a'];
Validator::make($data, $rules)->passes(); // false

// 全角文字
$data = ['parameter' => "1234"];
Validator::make($data, $rules)->passes(); // false

// 文字列
// ゼロ
$data = ['parameter' => '0'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '1'];
Validator::make($data, $rules)->passes(); // false

$data = ['parameter' => '3'];
Validator::make($data, $rules)->passes(); // true

// マイナス
$data = ['parameter' => '-3'];
Validator::make($data, $rules)->passes(); // true

// 符号付
$data = ['parameter' => '+3'];
Validator::make($data, $rules)->passes(); // true

// 8進表記
$data = ['parameter' => 0123]; // 83
Validator::make($data, $rules)->passes(); // false

$data = ['parameter' => '0123']; // 123 として扱われる
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '0o123'];
Validator::make($data, $rules)->passes(); // false

// 16進表記
$data = ['parameter' => '0x1A'];
Validator::make($data, $rules)->passes(); // false

// 2進表記
$data = ['parameter' => '0b11111111'];
Validator::make($data, $rules)->passes(); // false

// PHP 7.4.0 以降
$data = ['parameter' => '123_456'];
Validator::make($data, $rules)->passes(); // false

// 小数
$data = ['parameter' => '0.1234'];
Validator::make($data, $rules)->passes(); // false

// 数値
$data = ['parameter' => 2.99999999999999];
Validator::make($data, $rules)->passes(); // true

// 文字列
$data = ['parameter' => '2.99999999999999'];
Validator::make($data, $rules)->passes(); // false

Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L1507-L1528

[AD]