Value Validators

Need to quickly and easily verify that a variable contains, for example, a valid email address? Then Nette\Utils\Validators will come in handy, a static class with useful functions for validating values.

Installation:

composer require nette/utils

All examples assume the following class alias is defined:

use Nette\Utils\Validators;

Basic Usage

The Validators class provides numerous methods for checking values, such as isList(), isUnicode(), isEmail(), isUrl(), etc., for use in your code:

if (!Validators::isEmail($email)) {
	throw new InvalidArgumentException('Invalid email address provided.');
}

Furthermore, it can verify whether the value satisfies the so-called expected types, which is a string where the individual options are separated by a vertical bar |. This makes it easy to verify union types using is():

if (!Validators::is($val, 'int|string|bool')) {
	// Handle invalid type...
}

This also allows you to create systems where expectations need to be written as strings (e.g., in annotations or configurations) and then validate values against them.

You can also declare an assertion, which throws an exception if the expectation is not met.

Expected Types

Expected types form a string consisting of one or more variants separated by a pipe |, similar to how types are written in PHP (e.g., 'int|string|bool'). Nullable notation ?int is also accepted.

An array where all elements are of a certain type is written in the form int[].

Some types can be followed by a colon and a length :length or a range :[min]..[max], e.g., string:10 (a string of 10 bytes length), float:10.. (a number 10 or greater), array:..10 (an array with up to ten elements), or list:10..20 (a list with 10 to 20 elements), or a regular expression like pattern:[0-9]+.

Overview of types and rules:

PHP types
array range for the number of elements can be specified
bool  
float range for the value can be specified
int range for the value can be specified
null  
object  
resource  
scalar `int float bool string`
string range for the length in bytes can be specified      
callable        
iterable        
mixed        
Pseudo-types      
list indexed array, range for the number of elements can be specified      
none empty value: '', null, false, 0, 0.0[]      
number `int float`    
numeric number including string representation      
numericint integer including string representation      
unicode UTF-8 string, range for the length in characters can be specified      
Character class (must not be an empty string)      
alnum all characters are alphanumeric      
alpha all characters are letters [A-Za-z]      
digit all characters are digits      
lower all characters are lowercase letters [a-z]      
space all characters are whitespace      
upper all characters are uppercase letters [A-Z]      
xdigit all characters are hexadecimal digits [0-9A-Fa-f]      
Syntax validation      
pattern a regular expression that the entire string must match      
email Email      
identifier PHP identifier      
url URL      
uri URI      
Environment validation      
class is an existing class name      
interface is an existing interface name      
directory is an existing directory path      
file is an existing file path      

Assertion

assert ($value, string $expected, string $label='variable')void

Verifies that the value is one of the expected types separated by a pipe. If not, it throws an Nette\Utils\AssertionException. The word variable in the exception message can be replaced by the $label parameter.

Validators::assert('Nette', 'string:5'); // OK (string 'Nette' has 5 bytes)
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

Verifies that the element with key $key in array $array is one of the expected types separated by a pipe. If not, it throws an Nette\Utils\AssertionException. The string item '%' in array in the exception message can be replaced by the $label parameter.

$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.

Validators

is ($value, string $expected)bool

Checks if the value is one of the expected types separated by a pipe.

Validators::is(1, 'int|float');  // true
Validators::is(23, 'int:0..10'); // false (23 is outside the range 0-10)
Validators::is('Nette Framework', 'string:15');     // true, length is 15 bytes
Validators::is('Nette Framework', 'string:8..');    // true
Validators::is('Nette Framework', 'string:30..40'); // false

isEmail (mixed $value): bool

Verifies that the value is a valid email address. It does not verify that the domain actually exists, only the syntax is verified. The function also accounts for future TLDs, which may also be in unicode.

Validators::isEmail('example@nette.org'); // true
Validators::isEmail('example@localhost'); // false
Validators::isEmail('nette');             // false

isInRange (mixed $value, array $range)bool

Checks if the value is within the given range [min, max], where the upper or lower bound can be omitted (null). Numbers, strings, and DateTime objects can be compared.

If both boundaries are missing ([null, null]) or the value is null, it returns false.

Validators::isInRange(5, [0, 5]);     // true
Validators::isInRange(23, [null, 5]); // false
Validators::isInRange(23, [5]);       // true (equivalent to [5, null])
Validators::isInRange(1, [5]);        // false

isNone (mixed $value): bool

Checks if the value is 0, '', false, null, 0.0 or [].

Validators::isNone(0); // true
Validators::isNone(''); // true
Validators::isNone(false); // true
Validators::isNone(null); // true
Validators::isNone('nette'); // false

isNumeric (mixed $value)bool

Checks if the value is a number or a number represented as a string.

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 (scientific notation not accepted)

isNumericInt (mixed $value)bool

Checks if the value is an integer or an integer represented as a string.

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

Checks if the value is a syntactically valid identifier in PHP (e.g., for class names, method names, function names, etc.).

Validators::isPhpIdentifier('');        // false
Validators::isPhpIdentifier('Hello1');  // true
Validators::isPhpIdentifier('1Hello');  // false
Validators::isPhpIdentifier('one two'); // false

isBuiltinType (string $type)bool

Determines if $type is a PHP built-in type (e.g., string, int, array, bool). Otherwise, it's assumed to be a class name.

Validators::isBuiltinType('string'); // true
Validators::isBuiltinType('Foo');    // false

isTypeDeclaration (string $type)bool

Checks whether the given type declaration string is syntactically valid according to PHP's type declaration rules (including union, intersection, DNF types).

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

Determines if $type is one of the internal type keywords self, parent, or static.

Validators::isClassKeyword('self'); // true
Validators::isClassKeyword('Foo');  // false

isUnicode (mixed $value)bool

Checks if the value is a valid UTF-8 string.

Validators::isUnicode('nette'); // true
Validators::isUnicode('');      // true
Validators::isUnicode("\xA0");  // false (invalid UTF-8 sequence)

isUrl (mixed $value): bool

Checks if the value is a valid absolute URL address according to RFC 3986.

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 (userinfo part not validated by this function)
Validators::isUrl('nette.org');                   // false (missing scheme)

isUri (string $value): bool

Verifies that the value is a valid URI address, meaning it's a string starting with a syntactically valid scheme followed by a colon (e.g., http:, https:, mailto:, ftp:).

Validators::isUri('https://nette.org');           // true
Validators::isUri('mailto:gandalf@example.org');  // true
Validators::isUri('nette.org');                   // false (missing scheme)
version: 4.0 3.x 2.x