Değer Doğrulayıcıları
Bir değişkenin örneğin geçerli bir e-posta adresi içerdiğini hızlı ve kolayca doğrulamanız mı gerekiyor? O zaman değerleri doğrulamak için kullanışlı fonksiyonlar içeren statik sınıf Nette\Utils\Validators işinize yarayacak.
Kurulum:
composer require nette/utils
Tüm örnekler, aşağıdaki sınıf takma adının tanımlandığını varsayar:
use Nette\Utils\Validators;
Temel Kullanım
Validators sınıfı, kodunuzda kullanabileceğiniz pek çok değer denetleme metodu sunar: isUnicode(), isEmail(), isUrl() vb.
if (!Validators::isEmail($email)) {
throw new InvalidArgumentException('Invalid email address provided.');
}
Ayrıca değerin, seçeneklerin dikey çizgi | ile ayrıldığı bir dize olan Beklenen Türlerden birine uyup uymadığını da doğrulayabilir. Bu, is()
ile birleşim türlerini doğrulamayı kolaylaştırır:
if (!Validators::is($val, 'int|string|bool')) {
// Geçersiz türü ele al...
}
Bu, beklentilerin dize olarak yazılması gereken (örneğin açıklamalarda veya yapılandırmalarda) ve değerlerin bunlara göre doğrulandığı sistemler kurmanıza da olanak tanır.
Beklenti karşılanmadığında istisna fırlatan bir doğrulama iddiası da tanımlayabilirsiniz.
Beklenen Türler
Beklenen türler, PHP'de türlerin yazılışına benzer şekilde dikey çizgi | ile ayrılmış bir ya da daha
fazla seçenekten oluşan bir dizedir (örneğin 'int|string|bool'). Nullable yazımı ?int de kabul
edilir.
Tüm öğeleri belirli bir türde olan bir dizi int[] biçiminde yazılır.
Bazı türlerin ardına iki nokta üst üste ile bir uzunluk :uzunluk ya da bir aralık :[min]..[max]
gelebilir; örneğin string:10 (10 bayt uzunluğunda bir dize), float:10.. (10 veya daha büyük bir
sayı), array:..10 (en fazla on öğeli bir dizi) ya da list:10..20 (10 ile 20 arası öğeli bir
liste); ayrıca pattern:[0-9]+ gibi bir düzenli ifade de yazılabilir.
Türlerin ve kuralların özeti:
| PHP türleri | ||||
|---|---|---|---|---|
array |
öğe sayısı için aralık belirtilebilir | |||
bool |
||||
boolean |
bool için takma ad |
|||
float |
değer için aralık belirtilebilir | |||
int |
değer için aralık belirtilebilir | |||
integer |
int için takma ad |
|||
null |
||||
object |
||||
resource |
||||
scalar |
`int | float | bool | string` |
string |
bayt cinsinden uzunluk için aralık belirtilebilir | |||
callable |
||||
iterable |
||||
mixed |
||||
| Sözde türler | ||||
list |
indeksli dizi, öğe sayısı için aralık belirtilebilir | |||
none |
boş değer: '', null, false, 0, 0.0, [] |
|||
number |
`int | float` | ||
numeric |
dize gösterimi dahil sayı | |||
numericint |
dize gösterimi dahil tam sayı | |||
unicode |
UTF-8 dizesi, karakter cinsinden uzunluk için aralık belirtilebilir | |||
| Karakter sınıfı (boş dize olmamalı) | ||||
alnum |
tüm karakterler alfanümerik | |||
alpha |
tüm karakterler harf [A-Za-z] |
|||
digit |
tüm karakterler rakam | |||
lower |
tüm karakterler küçük harf [a-z] |
|||
space |
tüm karakterler boşluk | |||
upper |
tüm karakterler büyük harf [A-Z] |
|||
xdigit |
tüm karakterler onaltılık rakam [0-9A-Fa-f] |
|||
| Söz dizimi doğrulaması | ||||
pattern |
dizenin tamamının eşleşmesi gereken düzenli ifade | |||
email |
E-posta | |||
identifier |
PHP tanımlayıcısı | |||
url |
URL | |||
uri |
URI | |||
| Ortam doğrulaması | ||||
class |
var olan bir sınıf adı | |||
interface |
var olan bir arayüz adı | |||
directory |
var olan bir dizin yolu | |||
file |
var olan bir dosya yolu | |||
Doğrulama İddiası
assert($value, string $expected, string
$label='variable'): void
Değerin, dikey çizgiyle ayrılmış Beklenen Türlerden biri olduğunu doğrular.
Değilse Nette\Utils\AssertionException
fırlatır. İstisna mesajındaki variable sözcüğü $label parametresiyle değiştirilebilir.
Validators::assert('Nette', 'string:5'); // OK ('Nette' dizesi 5 bayt)
Validators::assert('Lorem ipsum dolor sit', 'string:78');
// AssertionException: The variable expects to be string in range 78, string 'Lorem ipsum dolor sit' given.
assertField(array $array, string|int $key,
?string $expected=null, string $label="item '%' in array"): void
$array dizisindeki $key anahtarlı öğenin, dikey çizgiyle ayrılmış Beklenen Türlerden biri olduğunu doğrular. Değilse Nette\Utils\AssertionException fırlatır. İstisna
mesajındaki item '%' in array dizesi $label parametresiyle 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 çizgiyle ayrılmış Beklenen Türlerden biri olup olmadığını denetler.
Validators::is(1, 'int|float'); // true
Validators::is(23, 'int:0..10'); // false (23, 0-10 aralığının dışında)
Validators::is('Nette Framework', 'string:15'); // true, uzunluk 15 bayt
Validators::is('Nette Framework', 'string:8..'); // true
Validators::is('Nette Framework', 'string:30..40'); // false
everyIs(iterable $values, string $expected): bool
Iterable içindeki her değerin, dikey çizgiyle ayrılmış Beklenen Türlerden biri olup olmadığını denetler. Her öğeye uygulanan is() gibi çalışır.
$list = ['Nette', 'Framework', 2020];
Validators::everyIs($list, 'string'); // false (2020 bir dize değil)
Validators::everyIs($list, 'string|int'); // true
isEmail(string $value): bool
Değerin geçerli bir e-posta adresi olduğunu doğrular. Alan adının gerçekten var olup olmadığını denetlemez, yalnızca söz dizimini doğrular. Fonksiyon, unicode da olabilen 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ı denetler; üst ya da alt sınır atlanabilir
(null). Sayılar, dizeler ve DateTime nesneleri karşılaştırılabilir.
Her iki sınır da eksikse ([null, null]) ya da 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 ([5, null] ile eşdeğer)
Validators::isInRange(1, [5]); // false
isNone(mixed $value): bool
Değerin 0, '', false, null, 0.0 ya da [] olup
olmadığını denetler.
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ı ya da dize olarak gösterilmiş bir sayı olup olmadığını denetler.
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 (bilimsel gösterim kabul edilmez)
isNumericInt(mixed $value): bool
Değerin bir tam sayı ya da dize olarak gösterilmiş bir tam sayı olup olmadığını denetler.
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öz dizimi açısından geçerli bir tanımlayıcı (örneğin sınıf, metot ya da fonksiyon adı) olup olmadığını denetler.
Validators::isPhpIdentifier(''); // false
Validators::isPhpIdentifier('Hello1'); // true
Validators::isPhpIdentifier('1Hello'); // false
Validators::isPhpIdentifier('one two'); // false
isBuiltinType(string $type): bool
$type değerinin PHP'nin yerleşik türlerinden biri (örneğin string, int,
array, bool) olup olmadığını belirler. Değilse sınıf adı sayılır.
Validators::isBuiltinType('string'); // true
Validators::isBuiltinType('Foo'); // false
isTypeDeclaration(string $type): bool
Verilen tür bildirimi dizesinin, PHP'nin tür bildirimi kurallarına göre (birleşim, kesişim ve DNF türleri dahil) söz dizimi açısından geçerli olup olmadığını denetler.
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 $name): bool
$name değerinin self, parent ya da static iç tür anahtar
sözcüklerinden biri olup olmadığını belirler.
Validators::isClassKeyword('self'); // true
Validators::isClassKeyword('Foo'); // false
isUnicode(mixed $value): bool
Değerin geçerli bir UTF-8 dizesi olup olmadığını denetler.
Validators::isUnicode('nette'); // true
Validators::isUnicode(''); // true
Validators::isUnicode("\xA0"); // false (geçersiz UTF-8 dizisi)
isUrl(string $value): bool
Değerin RFC 3986'ya göre geçerli bir mutlak URL adresi olup olmadığını denetler.
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 (userinfo kısmı bu fonksiyonla doğrulanmaz)
Validators::isUrl('nette.org'); // false (şema eksik)
isUri(string $value): bool
Değerin geçerli bir URI adresi olduğunu, yani söz dizimi açısından geçerli bir şema ile başlayıp ardından iki nokta
üst üste gelen bir dize olduğunu doğrular (örneğin http:, https:, mailto:,
ftp:).
Validators::isUri('https://nette.org'); // true
Validators::isUri('mailto:gandalf@example.org'); // true
Validators::isUri('nette.org'); // false (şema eksik)