Επικυρωτές τιμών
Χρειάζεται να επαληθεύσετε γρήγορα και εύκολα ότι μια μεταβλητή περιέχει, για παράδειγμα, μια έγκυρη διεύθυνση e-mail; Τότε θα σας φανεί χρήσιμη η Nette\Utils\Validators, μια στατική κλάση με χρήσιμες συναρτήσεις για την επικύρωση τιμών.
Εγκατάσταση:
composer require nette/utils
Όλα τα παραδείγματα προϋποθέτουν ότι έχει δημιουργηθεί ένα ψευδώνυμο:
use Nette\Utils\Validators;
Βασική χρήση
Η κλάση διαθέτει πολλές μεθόδους για τον έλεγχο τιμών, όπως isList(), isUnicode(), isEmail(), isUrl() κ.λπ. για χρήση στον κώδικά σας:
if (!Validators::isEmail($email)) {
throw new InvalidArgumentException;
}
Επιπλέον, μπορεί να επαληθεύσει εάν μια τιμή είναι ένας από τους
λεγόμενους αναμενόμενους τύπους, που είναι μια
συμβολοσειρά όπου οι μεμονωμένες επιλογές διαχωρίζονται με κάθετο
|
. Μπορούμε έτσι εύκολα να επαληθεύσουμε πολλούς τύπους
χρησιμοποιώντας το is():
if (!Validators::is($val, 'int|string|bool')) {
// ...
}
Αλλά μας δίνει επίσης τη δυνατότητα να δημιουργήσουμε ένα σύστημα όπου οι προσδοκίες πρέπει να γράφονται ως συμβολοσειρές (για παράδειγμα, σε annotations ή διαμόρφωση) και στη συνέχεια να επαληθεύουμε τις τιμές σύμφωνα με αυτές.
Για τους αναμενόμενους τύπους, μπορεί επίσης να τεθεί μια απαίτηση assert(), η οποία, εάν δεν πληρούται, δημιουργεί μια εξαίρεση.
Αναμενόμενοι τύποι
Οι αναμενόμενοι τύποι αποτελούν μια συμβολοσειρά που αποτελείται
από μία ή περισσότερες παραλλαγές διαχωρισμένες με κάθετο |
,
παρόμοια με τον τρόπο που γράφονται οι τύποι στην PHP (π.χ.
'int|string|bool')
. Η nullable σημειογραφία ?int
είναι επίσης
αποδεκτή.
Ένας πίνακας όπου όλα τα στοιχεία είναι συγκεκριμένου τύπου γράφεται
με τη μορφή int[]
.
Μετά από ορισμένους τύπους μπορεί να ακολουθεί διπλή τελεία και
μήκος :length
ή εύρος :[min]..[max]
, π.χ. string:10
(συμβολοσειρά
μήκους 10 bytes), float:10..
(αριθμός 10 και μεγαλύτερος), array:..10
(πίνακας έως δέκα στοιχείων) ή list:10..20
(λίστα με 10 έως 20 στοιχεία),
ή μια κανονική έκφραση για pattern:[0-9]+
.
Επισκόπηση τύπων και κανόνων:
Τύποι PHP | |
---|---|
array |
μπορεί να καθοριστεί εύρος για τον αριθμό των στοιχείων |
bool |
|
float |
μπορεί να καθοριστεί εύρος για την τιμή |
int |
μπορεί να καθοριστεί εύρος για την τιμή |
null |
|
object |
|
resource |
|
scalar |
int|float|bool|string |
string |
μπορεί να καθοριστεί εύρος για το μήκος σε bytes |
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 |
όλοι οι χαρακτήρες είναι δεκαεξαδικά ψηφία [0-9A-Fa-f] |
έλεγχος σύνταξης | |
pattern |
κανονική έκφραση στην οποία πρέπει να αντιστοιχεί ολόκληρη η συμβολοσειρά |
email |
|
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
Επαληθεύει εάν το στοιχείο με το κλειδί $key
στον πίνακα
$array
είναι ένας από τους αναμενόμενους τύπους
που διαχωρίζονται με κάθετο. Εάν όχι, δημιουργεί μια εξαίρεση 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 bytes
Validators::is('Nette Framework', 'string:8..'); // true
Validators::is('Nette Framework', 'string:30..40'); // false
isEmail (mixed $value): bool
Επαληθεύει εάν η τιμή είναι μια έγκυρη διεύθυνση e-mail. Δεν επαληθεύεται εάν ο τομέας υπάρχει πραγματικά, επαληθεύεται μόνο η σύνταξη. Η συνάρτηση λαμβάνει υπόψη και μελλοντικά 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