Wertvalidatoren
Sie müssen schnell und einfach prüfen, ob eine Variable zum Beispiel eine gültige E-Mail-Adresse enthält? Dann kommt Ihnen Nette\Utils\Validators gelegen, eine statische Klasse mit nützlichen Funktionen zum Validieren von Werten.
Installation:
composer require nette/utils
Alle Beispiele setzen voraus, dass dieser Klassen-Alias definiert ist:
use Nette\Utils\Validators;
Grundlegende Verwendung
Die Klasse Validators bietet zahlreiche Methoden zum Prüfen von Werten, etwa isUnicode(), isEmail(), isUrl() und so weiter, zur
Verwendung in Ihrem Code:
if (!Validators::isEmail($email)) {
throw new InvalidArgumentException('Es wurde eine ungültige E-Mail-Adresse übergeben.');
}
Darüber hinaus kann sie prüfen, ob ein Wert den sogenannten erwarteten Typen entspricht.
Das ist ein String, in dem die einzelnen Möglichkeiten durch einen senkrechten Strich | getrennt sind. So lassen
sich mit is() leicht Union-Typen prüfen:
if (!Validators::is($val, 'int|string|bool')) {
// Ungültigen Typ behandeln ...
}
Damit können Sie auch Systeme bauen, in denen Erwartungen als Strings notiert werden müssen (etwa in Annotationen oder Konfigurationen) und Werte anschließend dagegen validiert werden.
Sie können auch eine Assertion deklarieren, die eine Exception wirft, wenn die Erwartung nicht erfüllt ist.
Erwartete Typen
Die erwarteten Typen bilden einen String aus einer oder mehreren Varianten, die durch einen senkrechten Strich |
getrennt sind, ähnlich wie Typen in PHP geschrieben werden (z. B. 'int|string|bool'). Auch die Nullable-Schreibweise
?int wird akzeptiert.
Ein Array, dessen Elemente alle einen bestimmten Typ haben, wird in der Form int[] geschrieben.
Auf manche Typen kann ein Doppelpunkt und eine Länge :length oder ein Bereich :[min]..[max] folgen,
etwa string:10 (ein String mit einer Länge von 10 Bytes), float:10.. (eine Zahl größer oder gleich
10), array:..10 (ein Array mit höchstens zehn Elementen) oder list:10..20 (eine Liste mit 10 bis
20 Elementen), oder ein regulärer Ausdruck wie pattern:[0-9]+.
Übersicht der Typen und Regeln:
| PHP-Typen | ||||
|---|---|---|---|---|
array |
ein Bereich für die Anzahl der Elemente lässt sich angeben | |||
bool |
||||
boolean |
Alias für bool |
|||
float |
ein Bereich für den Wert lässt sich angeben | |||
int |
ein Bereich für den Wert lässt sich angeben | |||
integer |
Alias für int |
|||
null |
||||
object |
||||
resource |
||||
scalar |
`int | float | bool | string` |
string |
ein Bereich für die Länge in Bytes lässt sich angeben | |||
callable |
||||
iterable |
||||
mixed |
||||
| Pseudotypen | ||||
list |
indiziertes Array, ein Bereich für die Anzahl der Elemente lässt sich angeben | |||
none |
leerer Wert: '', null, false, 0, 0.0, [] |
|||
number |
`int | float` | ||
numeric |
Zahl samt String-Darstellung | |||
numericint |
ganze Zahl samt String-Darstellung | |||
unicode |
UTF-8-String, ein Bereich für die Länge in Zeichen lässt sich angeben | |||
| Zeichenklasse (darf kein leerer String sein) | ||||
alnum |
alle Zeichen sind alphanumerisch | |||
alpha |
alle Zeichen sind Buchstaben [A-Za-z] |
|||
digit |
alle Zeichen sind Ziffern | |||
lower |
alle Zeichen sind Kleinbuchstaben [a-z] |
|||
space |
alle Zeichen sind Leerraum | |||
upper |
alle Zeichen sind Großbuchstaben [A-Z] |
|||
xdigit |
alle Zeichen sind hexadezimale Ziffern [0-9A-Fa-f] |
|||
| Prüfung der Syntax | ||||
pattern |
ein regulärer Ausdruck, dem der gesamte String entsprechen muss | |||
email |
||||
identifier |
PHP-Bezeichner | |||
url |
URL | |||
uri |
URI | |||
| Prüfung der Umgebung | ||||
class |
ist der Name einer existierenden Klasse | |||
interface |
ist der Name eines existierenden Interfaces | |||
directory |
ist der Pfad eines existierenden Verzeichnisses | |||
file |
ist der Pfad einer existierenden Datei | |||
Assertion
assert ($value, string $expected, string
$label='variable'): void
Prüft, ob der Wert einem der durch einen senkrechten Strich getrennten erwarteten Typen
entspricht. Ist das nicht der Fall, wirft die Methode eine Nette\Utils\AssertionException. Das Wort
variable in der Meldung der Exception lässt sich über den Parameter $label ersetzen.
Validators::assert('Nette', 'string:5'); // OK (der String 'Nette' hat 5 Bytes)
Validators::assert('Lorem ipsum dolor sit', 'string:78');
// AssertionException: The variable expects to be string in range 78, string 'Lorem ipsum dolor sit' given.
assertField (array $array, string|int
$key, ?string $expected=null, string $label="item '%' in array"): void
Prüft, ob das Element mit dem Schlüssel $key im Array $array einem der durch einen senkrechten
Strich getrennten erwarteten Typen entspricht. Ist das nicht der Fall, wirft die Methode eine
Nette\Utils\AssertionException. Der String
item '%' in array in der Meldung der Exception lässt sich über den Parameter $label ersetzen.
$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.
Validatoren
is ($value, string $expected): bool
Prüft, ob der Wert einem der durch einen senkrechten Strich getrennten erwarteten Typen entspricht.
Validators::is(1, 'int|float'); // true
Validators::is(23, 'int:0..10'); // false (23 liegt außerhalb des Bereichs 0-10)
Validators::is('Nette Framework', 'string:15'); // true, die Länge beträgt 15 Bytes
Validators::is('Nette Framework', 'string:8..'); // true
Validators::is('Nette Framework', 'string:30..40'); // false
everyIs (iterable $values, string $expected): bool
Prüft, ob jeder Wert in der iterierbaren Struktur einem der durch einen senkrechten Strich getrennten erwarteten Typen entspricht. Es funktioniert wie is(), angewendet auf jedes Element.
$list = ['Nette', 'Framework', 2020];
Validators::everyIs($list, 'string'); // false (2020 ist kein String)
Validators::everyIs($list, 'string|int'); // true
isEmail (string $value): bool
Prüft, ob der Wert eine gültige E-Mail-Adresse ist. Ob die Domain tatsächlich existiert, wird nicht geprüft, sondern nur die Syntax. Die Funktion berücksichtigt auch künftige TLDs, die auch in Unicode vorliegen können.
Validators::isEmail('example@nette.org'); // true
Validators::isEmail('example@localhost'); // false
Validators::isEmail('nette'); // false
isInRange (mixed $value, array $range): bool
Prüft, ob der Wert im angegebenen Bereich [min, max] liegt, wobei die obere oder die untere Grenze entfallen kann
(null). Vergleichen lassen sich Zahlen, Strings und DateTime-Objekte.
Fehlen beide Grenzen ([null, null]) oder ist der Wert null, gibt die Methode false
zurück.
Validators::isInRange(5, [0, 5]); // true
Validators::isInRange(23, [null, 5]); // false
Validators::isInRange(23, [5]); // true (gleichbedeutend mit [5, null])
Validators::isInRange(1, [5]); // false
isNone (mixed $value): bool
Prüft, ob der Wert 0, '', false, null, 0.0 oder
[] ist.
Validators::isNone(0); // true
Validators::isNone(''); // true
Validators::isNone(false); // true
Validators::isNone(null); // true
Validators::isNone('nette'); // false
isNumeric (mixed $value): bool
Prüft, ob der Wert eine Zahl oder eine als String dargestellte Zahl ist.
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 (die wissenschaftliche Schreibweise wird nicht akzeptiert)
isNumericInt (mixed $value): bool
Prüft, ob der Wert eine ganze Zahl oder eine als String dargestellte ganze Zahl ist.
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
Prüft, ob der Wert ein syntaktisch gültiger Bezeichner in PHP ist (etwa für Klassennamen, Methodennamen, Funktionsnamen und so weiter).
Validators::isPhpIdentifier(''); // false
Validators::isPhpIdentifier('Hello1'); // true
Validators::isPhpIdentifier('1Hello'); // false
Validators::isPhpIdentifier('one two'); // false
isBuiltinType (string $type): bool
Ermittelt, ob $type ein in PHP eingebauter Typ ist (etwa string, int,
array, bool). Andernfalls wird angenommen, dass es sich um einen Klassennamen handelt.
Validators::isBuiltinType('string'); // true
Validators::isBuiltinType('Foo'); // false
isTypeDeclaration (string $type): bool
Prüft, ob der angegebene String einer Typdeklaration nach den Regeln von PHP syntaktisch gültig ist (einschließlich Union-, Intersection- und DNF-Typen).
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 $name): bool
Ermittelt, ob $name eines der internen Typschlüsselwörter self, parent oder
static ist.
Validators::isClassKeyword('self'); // true
Validators::isClassKeyword('Foo'); // false
isUnicode (mixed $value): bool
Prüft, ob der Wert ein gültiger UTF-8-String ist.
Validators::isUnicode('nette'); // true
Validators::isUnicode(''); // true
Validators::isUnicode("\xA0"); // false (ungültige UTF-8-Sequenz)
isUrl (string $value): bool
Prüft, ob der Wert eine gültige absolute URL-Adresse nach RFC 3986 ist.
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 (der Teil userinfo wird von dieser Funktion nicht validiert)
Validators::isUrl('nette.org'); // false (das Schema fehlt)
isUri (string $value): bool
Prüft, ob der Wert eine gültige URI-Adresse ist, also ein String, der mit einem syntaktisch gültigen Schema samt Doppelpunkt
beginnt (etwa http:, https:, mailto:, ftp:).
Validators::isUri('https://nette.org'); // true
Validators::isUri('mailto:gandalf@example.org'); // true
Validators::isUri('nette.org'); // false (das Schema fehlt)