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
versiyon: 4.0