値バリデータ
変数に有効なメールアドレスなどが含まれているかを迅速かつ簡単に検証する必要がありますか?その場合、値の検証に役立つ関数を持つ静的クラス Nette\Utils\Validators が便利です。
インストール:
composer require nette/utils
すべての例は、エイリアスが作成されていることを前提としています:
use Nette\Utils\Validators;
基本的な使用法
このクラスには、Unicodeかどうか、Eメールかどうか、URLかどうか など、コードで使用するための値をチェックする多くのメソッドがあります:
if (!Validators::isEmail($email)) {
throw new InvalidArgumentException;
}
さらに、値がいわゆる 期待される型
であるかどうかを検証できます。これは、個々のオプションがパイプ |
で区切られた文字列です。これにより、is()
を使用して複数の型を簡単に検証できます:
if (!Validators::is($val, 'int|string|bool')) {
// ...
}
しかし、これはまた、期待値を文字列として記述する必要があるシステム(例えば、アノテーションや設定ファイル内)を作成し、それに基づいて値を検証する可能性も与えてくれます。
期待される型に対して assert() 要求を適用することもできます。これが満たされない場合、例外がスローされます。
期待される型
期待される型は、PHPで型を記述する方法と同様に、パイプ |
で区切られた1つ以上のバリアントで構成される文字列です(例:
'int|string|bool'
)。null許容表記 ?int
も受け入れられます。
すべての要素が特定の型である配列は、int[]
の形式で記述されます。
一部の型の後には、コロンと長さ :length
または範囲 :[min]..[max]
が続くことがあります。例:
string:10
(長さ10バイトの文字列)、float:10..
(10以上の数値)、array:..10
(10要素以下の配列)、list:10..20
(10〜20要素のリスト)、または
pattern:[0-9]+
の正規表現。
型とルールの概要:
PHP 型 | |
---|---|
array |
要素数の範囲を指定できます |
bool |
|
float |
値の範囲を指定できます |
int |
値の範囲を指定できます |
null |
|
object |
|
resource |
|
scalar |
int|float|bool|string |
string |
バイト単位の長さの範囲を指定できます |
callable |
|
iterable |
|
mixed |
|
疑似型 | |
list |
インデックス付き配列、要素数の範囲を指定できます |
none |
空の値: '' 、null 、false |
number |
int|float |
numeric |
テキスト表現を含む数値 |
numericint |
テキスト表現を含む整数 |
unicode |
UTF-8文字列、文字単位の長さの範囲を指定できます |
文字クラス (空文字列であってはなりません) | |
alnum |
すべての文字が英数字 |
alpha |
すべての文字がアルファベット [A-Za-z] |
digit |
すべての文字が数字 |
lower |
すべての文字が小文字 [a-z] |
space |
すべての文字が空白文字 |
upper |
すべての文字が大文字 [A-Z] |
xdigit |
すべての文字が16進数 [0-9A-Fa-f] |
構文検証 | |
pattern |
文字列全体に一致する必要がある正規表現 |
email |
Eメール |
identifier |
PHP識別子 |
url |
URL |
uri |
URI |
環境検証 | |
class |
存在するクラス |
interface |
存在するインターフェース |
directory |
存在するディレクトリ |
file |
存在するファイル |
アサーション
assert ($value, string $expected, string
$label='variable'
): void
値がパイプで区切られた 期待される型
のいずれかであることを検証します。そうでない場合、Nette\Utils\AssertionException
例外をスローします。例外メッセージ内の単語 variable
は、パラメータ $label
で別の単語に置き換えることができます。
Validators::assert('Nette', 'string:5'); // OK
Validators::assert('Lorem ipsum dolor sit', 'string:78');
// AssertionException: The variable expects to be string:78, string 'Lorem ipsum dolor sit' given.
assertField (array $array, string|int $key, ?string $expected=null, ?string $label=null): void
配列 $array
内のキー $key
の下の要素が、パイプで区切られた 期待される型 のいずれかであることを検証します。そうでない場合、Nette\Utils\AssertionException
例外をスローします。例外メッセージ内の文字列 item '%' in array
は、パラメータ
$label
で別の文字列に置き換えることができます。
$arr = ['foo' => 'Nette'];
Validators::assertField($arr, 'foo', 'string:5'); // OK
Validators::assertField($arr, 'bar', 'string:15');
// AssertionException: Missing item 'bar' in array.
Validators::assertField($arr, 'foo', 'int');
// AssertionException: The item 'foo' in array expects to be int, string 'Nette' given.
バリデータ
is ($value, string $expected): bool
値がパイプで区切られた 期待される型 のいずれかであるかどうかを検証します。
Validators::is(1, 'int|float'); // true
Validators::is(23, 'int:0..10'); // false
Validators::is('Nette Framework', 'string:15'); // true、長さは15バイトです
Validators::is('Nette Framework', 'string:8..'); // true
Validators::is('Nette Framework', 'string:30..40'); // false
isEmail (mixed $value): bool
値が有効なメールアドレスであるかどうかを検証します。ドメインが実際に存在するかどうかは検証されず、構文のみが検証されます。この関数は、Unicodeである可能性のある将来の TLD も考慮します。
Validators::isEmail('example@nette.org'); // true
Validators::isEmail('example@localhost'); // false
Validators::isEmail('nette'); // false
isInRange (mixed $value, array $range): bool
値が指定された範囲 [min, max]
内にあるかどうかを検証します。上限または下限は省略できます(null
)。数値、文字列、DateTimeオブジェクトを比較できます。
両方の境界が欠落している場合([null, null]
)または値が null
の場合、false
を返します。
Validators::isInRange(5, [0, 5]); // true
Validators::isInRange(23, [null, 5]); // false
Validators::isInRange(23, [5]); // true
Validators::isInRange(1, [5]); // false
isNone (mixed $value): bool
値が 0
、''
、false
、または null
であるかどうかを検証します。
Validators::isNone(0); // true
Validators::isNone(''); // true
Validators::isNone(false); // true
Validators::isNone(null); // true
Validators::isNone('nette'); // false
isNumeric (mixed $value): bool
値が数値または文字列で記述された数値であるかどうかを検証します。
Validators::isNumeric(23); // true
Validators::isNumeric(1.78); // true
Validators::isNumeric('+42'); // true
Validators::isNumeric('3.14'); // true
Validators::isNumeric('nette'); // false
Validators::isNumeric('1e6'); // false
isNumericInt (mixed $value): bool
値が整数または文字列で記述された整数であるかどうかを検証します。
Validators::isNumericInt(23); // true
Validators::isNumericInt(1.78); // false
Validators::isNumericInt('+42'); // true
Validators::isNumericInt('3.14'); // false
Validators::isNumericInt('nette'); // false
isPhpIdentifier (string $value): bool
値がPHPで構文的に有効な識別子(クラス名、メソッド名、関数名など)であるかどうかを検証します。
Validators::isPhpIdentifier(''); // false
Validators::isPhpIdentifier('Hello1'); // true
Validators::isPhpIdentifier('1Hello'); // false
Validators::isPhpIdentifier('one two'); // false
isBuiltinType (string $type): bool
$type
がPHPの組み込み型かどうかを調べます。そうでない場合は、クラス名です。
Validators::isBuiltinType('string'); // true
Validators::isBuiltinType('Foo'); // false
isTypeDeclaration (string $type): bool
指定された型宣言が構文的に有効かどうかをチェックします。
Validators::isTypeDeclaration('?string'); // true
Validators::isTypeDeclaration('string|null'); // true
Validators::isTypeDeclaration('Foo&Bar'); // true
Validators::isTypeDeclaration('(A&C)|null'); // true
Validators::isTypeDeclaration('?string|null'); // false
Validators::isTypeDeclaration('|foo'); // false
Validators::isTypeDeclaration('(A|B)'); // false
isClassKeyword (string $type): bool
$type
が内部型 self
、parent
、static
のいずれかであるかどうかを調べます。
Validators::isClassKeyword('self'); // true
Validators::isClassKeyword('Foo'); // false
isUnicode (mixed $value): bool
値が有効なUTF-8文字列であるかどうかを検証します。
Validators::isUnicode('nette'); // true
Validators::isUnicode(''); // true
Validators::isUnicode("\xA0"); // false
isUrl (mixed $value): bool
値が有効なURLアドレスであるかどうかを検証します。
Validators::isUrl('https://nette.org:8080/path?query#fragment'); // true
Validators::isUrl('http://localhost'); // true
Validators::isUrl('http://192.168.1.1'); // true
Validators::isUrl('http://[::1]'); // true
Validators::isUrl('http://user:pass@nette.org'); // false
Validators::isUrl('nette.org'); // false
isUri (string $value): bool
値が有効なURIアドレス、つまり構文的に有効なスキームで始まる文字列であるかどうかを検証します。
Validators::isUri('https://nette.org'); // true
Validators::isUri('mailto:gandalf@example.org'); // true
Validators::isUri('nette.org'); // false