概要
- integerバリデーションは指定されたキーの値が「整数なのか否か」をチェックしている。なので数値の1でも文字列の1でもintegerバリデーションは通過する。
- どうして整数なら何でも通すのかを確認してみる。
内容
-
そもそもintegerバリデーションルールのチェックは下記で判定されている。
-
vendor/laravel/framework/src/Illuminate/Validation/Concerns/ValidatesAttributes.php
のvalidateInteger()
メソッド
-
-
当該メソッドの内容を下記に抜粋する。
ValidatesAttributes.php/** * Validate that an attribute is an integer. * * @param string $attribute * @param mixed $value * @return bool */ public function validateInteger($attribute, $value) { return filter_var($value, FILTER_VALIDATE_INT) !== false; }
-
どうやらPHPの組み込み関数であるfilter_var関数で値のチェックしているっぽい。
-
filter_var関数の第2引数に渡しているフィルターの型で「FILTER_VALIDATE_INT」を指定している。当該フィルターの型は引数が整数の場合その値を、それ以外はfalseを返すらしい。
-
なので、そもそもチェックするメソッドそのものが数値の1でも、文字列の1でも通過するようにチェックしてるっぽい。
-
実際にfilter_var関数を使って遊んで見る。
<?php // Your code here! $int = 2; $str = '2'; $strFoo = 'aa'; var_dump(filter_var($int, FILTER_VALIDATE_INT)); // int(2) var_dump(filter_var($str, FILTER_VALIDATE_INT)); // int(2) var_dump(filter_var($strFoo, FILTER_VALIDATE_INT)); // bool(false)