Επικυρωτές τιμών

Χρειάζεται να επαληθεύσετε γρήγορα και εύκολα ότι μια μεταβλητή περιέχει για παράδειγμα μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου; Τότε θα σας φανεί χρήσιμη η Nette\Utils\Validators, μια στατική κλάση με χρήσιμες συναρτήσεις για την επικύρωση τιμών.

Εγκατάσταση:

composer require nette/utils

Όλα τα παραδείγματα προϋποθέτουν ότι έχει οριστεί το ακόλουθο ψευδώνυμο κλάσης:

use Nette\Utils\Validators;

Βασική χρήση

Η κλάση Validators διαθέτει έναν αριθμό μεθόδων για την επικύρωση τιμών, όπως isList(), isUnicode(), isEmail(), isUrl(), κλπ. για χρήση στον κώδικά σας:

if (!Validators::isEmail($email)) {
	throw new InvalidArgumentException;
}

Επιπλέον, μπορεί να ελέγξει αν η τιμή ικανοποιεί τους λεγόμενους αναμενόμενους τύπους, οι οποίοι είναι μια συμβολοσειρά όπου οι επιμέρους επιλογές χωρίζονται με κάθετη γραμμή |. Αυτό καθιστά εύκολη την επαλήθευση των τύπων ένωσης με τη χρήση της if():

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

Αλλά σας δίνει επίσης τη δυνατότητα να δημιουργήσετε ένα σύστημα όπου είναι απαραίτητο να γράψετε τις προσδοκίες ως συμβολοσειρές (για παράδειγμα σε σημειώσεις ή ρυθμίσεις) και στη συνέχεια να επαληθεύσετε σύμφωνα με αυτές.

Μπορείτε επίσης να δηλώσετε ισχυρισμό, ο οποίος πετάει μια εξαίρεση αν δεν ικανοποιείται.

Αναμενόμενοι τύποι

Ένας αναμενόμενος τύπος είναι μια συμβολοσειρά που αποτελείται από μία ή περισσότερες παραλλαγές που χωρίζονται με κάθετη γραμμή |, similar to writing types in PHP (ie. 'int|string|bool'). Επιτρέπεται επίσης η μηδενική σημειογραφία ?int.

Ένας πίνακας όπου όλα τα στοιχεία είναι ενός συγκεκριμένου τύπου γράφεται με τη μορφή int[].

Ορισμένοι τύποι μπορούν να ακολουθούνται από άνω και κάτω τελεία και το μήκος :length ή το εύρος :[min]..[max], π.χ. string:10 (ένα αλφαριθμητικό με μήκος 10 bytes), float:10.. (αριθμός 10 και μεγαλύτερος), array:..10 (πίνακας με έως και δέκα στοιχεία) ή list:10..20 (λίστα με 10 έως 20 στοιχεία), ή μια κανονική έκφραση για το pattern:[0-9]+.

Επισκόπηση των τύπων και των κανόνων:

PHP types
array μπορεί να δοθεί εύρος για τον αριθμό των στοιχείων
bool  
float Το εύρος για την τιμή μπορεί να δοθεί
int μπορεί να δοθεί εύρος τιμών
null  
object  
resource  
scalar int|float|bool|string
string μπορεί να δοθεί εύρος για το μήκος σε bytes
callable  
iterable  
mixed  
pseudo-types
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 όλοι οι χαρακτήρες είναι δεκαεξαδικά ψηφία [0-9A-Fa-f]
επικύρωση σύνταξης
pattern μια κανονική έκφραση με την οποία πρέπει να ταιριάζει η ολόκληρη συμβολοσειρά
email Email
identifier Αναγνωριστικό PHP
url URL
uri URI
επικύρωση περιβάλλοντος
class is existing class
interface είναι υπάρχουσα διεπαφή
directory is existing directory
file είναι υπάρχον αρχείο

Ισχυρισμός

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

Επαληθεύει ότι η τιμή είναι των αναμενόμενων τύπων που διαχωρίζονται με pipe. Εάν όχι, πετάει εξαίρεση 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

Επαληθεύει ότι το στοιχείο $key στον πίνακα $array αποτελείται από τους αναμενόμενους τύπους που χωρίζονται με pipe. Αν όχι, πετάει την εξαίρεση 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

Ελέγχει αν η τιμή είναι από τους αναμενόμενους τύπους που διαχωρίζονται με pipe.

Validators::is(1, 'int|float');  // true
Validators::is(23, 'int:0..10'); // false
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

Επαληθεύει ότι η τιμή είναι έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου. Δεν επαληθεύει την πραγματική ύπαρξη του τομέα, αλλά μόνο τη σύνταξη. Η συνάρτηση υπολογίζει επίσης τα μελλοντικά TLD, τα οποία μπορεί επίσης να είναι σε unicode.

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
έκδοση: 4.0