Laravel バリデーションについてまとめていくよ2(文字種編)に続いてlaravelのバリデーションをまとめていきます。
今回は、数値についてのバリデーションを確認します。
確認するルールはinteger
、digits
、digits_between
、max_digits
、min_digits
、numeric
、decimal
、multiple_of
です。
integer | 整数
整数であることをチェックします。
Laravle公式のバリデーションのドキュメントに下記のように(翻訳済みです)あります。
この検証ルールは入力がinteger型であることを検証するものではなく、PHPの
https://laravel.com/docs/9.x/validation#rule-integerFILTER_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での実装はこちら。
PHPでの整数の定義は下記のようになっています。
https://www.php.net/manual/ja/language.types.integer.phpdecimal : [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での実装はこちら。
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での実装はこちら。
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での実装はこちら。
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での実装はこちら。
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での実装はこちら。
PHPでの数値形式の定義は下記のようになっています。
https://www.php.net/manual/ja/language.types.numeric-strings.phpWHITESPACES \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} [+-]? ({DNUM} | {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での実装はこちら。
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での実装はこちら。
[AD]