Laravel バリデーションについてまとめていくよ2(文字種編)に続いてlaravelのバリデーションをまとめていきます。
今回は、数値についてのバリデーションを確認します。
確認するルールはinteger
、digits
、digits_between
、max_digits
、min_digits
、numeric
、decimal
、multiple_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
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})
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