Επικυρωτές τιμών
Χρειάζεται να επαληθεύσετε γρήγορα και εύκολα ότι μια μεταβλητή περιέχει για παράδειγμα μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου; Τότε θα σας φανεί χρήσιμη η 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 |
|
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