Değer Doğrulayıcıları
Bir değişkenin geçerli bir e-posta adresi olup olmadığını hızlı ve kolay bir şekilde doğrulamanız mı gerekiyor? Değerleri doğrulamak için yararlı fonksiyonlar içeren statik bir sınıf olan Nette\Utils\Validators işinize yarayacaktır.
Kurulum:
composer require nette/utils
Tüm örnekler, bir takma ad oluşturulduğunu varsayar:
use Nette\Utils\Validators;
Temel Kullanım
Sınıf, kodunuzda kullanmak üzere isList(), isUnicode(), isEmail(), isUrl() vb. gibi değerleri kontrol etmek için bir dizi metoda sahiptir:
if (!Validators::isEmail($email)) {
throw new InvalidArgumentException;
}
Ayrıca, bir değerin beklenen tipler olup olmadığını doğrulayabilir, bu, bireysel
seçeneklerin dikey çizgi |
ile ayrıldığı bir karakter dizisidir. Böylece if() kullanarak
birden fazla türü kolayca doğrulayabiliriz:
if (!Validators::is($val, 'int|string|bool')) {
// ...
}
Ancak bu aynı zamanda bize, beklentilerin karakter dizileri olarak yazılması gereken (örneğin ek açıklamalarda veya yapılandırmada) ve ardından değerlerin bunlara göre doğrulanması gereken bir sistem oluşturma yeteneği de verir.
Beklenen türler için assert() gereksinimi de uygulanabilir, bu gereksinim karşılanmazsa bir istisna fırlatılır.
Beklenen Tipler
Beklenen tipler, PHP'de türlerin yazıldığına benzer şekilde (örneğin 'int|string|bool'
) dikey çizgi
|
ile ayrılmış bir veya daha fazla varyanttan oluşan bir karakter dizisidir. Null atanabilir gösterim
?int
de kabul edilir.
Tüm öğelerin belirli bir türde olduğu diziler int[]
şeklinde yazılır.
Bazı türlerin ardından iki nokta üst üste ve uzunluk :length
veya aralık :[min]..[max]
gelebilir, örn. string:10
(10 bayt uzunluğunda karakter dizisi), float:10..
(10 ve daha büyük
sayı), array:..10
(en fazla on öğeli dizi) veya list:10..20
(10 ila 20 öğeli liste) veya
pattern:[0-9]+
için düzenli ifade.
Türlerin ve kuralların özeti:
PHP tipleri | |
---|---|
array |
öğe sayısı için bir aralık belirtilebilir |
bool |
|
float |
değer için bir aralık belirtilebilir |
int |
değer için bir aralık belirtilebilir |
null |
|
object |
|
resource |
|
scalar |
int|float|bool|string |
string |
bayt cinsinden uzunluk için bir aralık belirtilebilir |
callable |
|
iterable |
|
mixed |
|
sözde tipler | |
list |
indeksli dizi, öğe sayısı için bir aralık belirtilebilir |
none |
boş değer: '' , null , false |
number |
int|float |
numeric |
metin gösterimi dahil sayı |
numericint |
metin gösterimi dahil tamsayı |
unicode |
UTF-8 karakter dizisi, karakter cinsinden uzunluk için bir aralık belirtilebilir |
karakter sınıfı (boş karakter dizisi olamaz) | |
alnum |
tüm karakterler alfanümeriktir |
alpha |
tüm karakterler harftir [A-Za-z] |
digit |
tüm karakterler rakamdır |
lower |
tüm karakterler küçük harftir [a-z] |
space |
tüm karakterler boşluktur |
upper |
tüm karakterler büyük harftir [A-Z] |
xdigit |
tüm karakterler onaltılık rakamlardır [0-9A-Fa-f] |
sözdizimi doğrulaması | |
pattern |
tüm karakter dizisinin eşleşmesi gereken düzenli ifade |
email |
E-posta |
identifier |
PHP tanımlayıcısı |
url |
URL |
uri |
URI |
ortam doğrulaması | |
class |
mevcut bir sınıftır |
interface |
mevcut bir arayüzdür |
directory |
mevcut bir dizindir |
file |
mevcut bir dosyadır |
Doğrulama İfadeleri (Assertions)
assert ($value, string $expected, string
$label='variable'
): void
Değerin, dikey çizgi ile ayrılmış beklenen tiplerden biri olup olmadığını doğrular.
Değilse, Nette\Utils\AssertionException
istisnası fırlatır. İstisna metnindeki variable
kelimesi $label
parametresiyle başka bir kelimeyle
değiştirilebilir.
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
$array
dizisindeki $key
anahtarı altındaki öğenin, dikey çizgi ile ayrılmış beklenen tiplerden biri olup olmadığını doğrular. Değilse, Nette\Utils\AssertionException istisnası
fırlatır. İstisna metnindeki item '%' in array
karakter dizisi $label
parametresiyle başka bir
karakter dizisiyle değiştirilebilir.
$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.
Doğrulayıcılar
is ($value, string $expected): bool
Değerin, dikey çizgi ile ayrılmış beklenen tiplerden biri olup olmadığını doğrular.
Validators::is(1, 'int|float'); // true
Validators::is(23, 'int:0..10'); // false
Validators::is('Nette Framework', 'string:15'); // true, uzunluk 15 bayttır
Validators::is('Nette Framework', 'string:8..'); // true
Validators::is('Nette Framework', 'string:30..40'); // false
isEmail (mixed $value): bool
Değerin geçerli bir e-posta adresi olup olmadığını doğrular. Alan adının gerçekten var olup olmadığı kontrol edilmez, yalnızca sözdizimi kontrol edilir. Fonksiyon, unicode olabilecek gelecekteki TLD'leri de hesaba katar.
Validators::isEmail('example@nette.org'); // true
Validators::isEmail('example@localhost'); // false
Validators::isEmail('nette'); // false
isInRange (mixed $value, array $range): bool
Değerin verilen [min, max]
aralığında olup olmadığını doğrular, burada üst veya alt sınır atlanabilir
(null
). Sayılar, karakter dizileri ve DateTime nesneleri karşılaştırılabilir.
Her iki sınır da eksikse ([null, null]
) veya değer null
ise, false
döndürür.
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
Değerin 0
, ''
, false
veya null
olup olmadığını doğrular.
Validators::isNone(0); // true
Validators::isNone(''); // true
Validators::isNone(false); // true
Validators::isNone(null); // true
Validators::isNone('nette'); // false
isNumeric (mixed $value): bool
Değerin bir sayı veya bir karakter dizisinde yazılmış bir sayı olup olmadığını doğrular.
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
Değerin bir tamsayı veya bir karakter dizisinde yazılmış bir tamsayı olup olmadığını doğrular.
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
Değerin PHP'de sözdizimsel olarak geçerli bir tanımlayıcı olup olmadığını doğrular, örneğin sınıf, metot, fonksiyon adları vb. için.
Validators::isPhpIdentifier(''); // false
Validators::isPhpIdentifier('Hello1'); // true
Validators::isPhpIdentifier('1Hello'); // false
Validators::isPhpIdentifier('one two'); // false
isBuiltinType (string $type): bool
$type
'ın yerleşik bir PHP türü olup olmadığını belirler. Aksi takdirde, bir sınıf adıdır.
Validators::isBuiltinType('string'); // true
Validators::isBuiltinType('Foo'); // false
isTypeDeclaration (string $type): bool
Verilen tür bildiriminin sözdizimsel olarak geçerli olup olmadığını kontrol eder.
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
'ın self
, parent
, static
dahili türlerinden biri olup olmadığını
belirler.
Validators::isClassKeyword('self'); // true
Validators::isClassKeyword('Foo'); // false
isUnicode (mixed $value): bool
Değerin geçerli bir UTF-8 karakter dizisi olup olmadığını doğrular.
Validators::isUnicode('nette'); // true
Validators::isUnicode(''); // true
Validators::isUnicode("\xA0"); // false
isUrl (mixed $value): bool
Değerin geçerli bir URL adresi olup olmadığını doğrular.
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
Değerin geçerli bir URI adresi olup olmadığını doğrular, yani aslında sözdizimsel olarak geçerli bir şema ile başlayan bir karakter dizisi.
Validators::isUri('https://nette.org'); // true
Validators::isUri('mailto:gandalf@example.org'); // true
Validators::isUri('nette.org'); // false