Schema: Veri Doğrulama
Akıllı, anlaşılır bir API ile belirli bir şemaya göre veri yapılarının doğrulanması ve normalleştirilmesi için pratik bir kütüphane.
Kurulum:
Temel Kullanım
$schema
değişkeninde doğrulama şemamız var (bunun tam olarak ne anlama geldiğini ve böyle bir şemanın
nasıl oluşturulacağını birazdan açıklayacağız) ve $data
değişkeninde doğrulamak ve normalleştirmek
istediğimiz veri yapısı var. Bu, örneğin bir API arayüzü aracılığıyla kullanıcı tarafından gönderilen veriler, bir
yapılandırma dosyası vb. olabilir.
Görevi, girişi işleyen ve ya normalleştirilmiş verileri döndüren ya da bir hata durumunda bir Nette\Schema\ValidationException istisnası fırlatan Nette\Schema\Processor sınıfı üstlenir.
$e->getMessages()
metodu tüm mesajların dizisini dizeler olarak döndürür ve
$e->getMessageObjects()
tüm mesajları Nette\Schema\Message nesneleri olarak döndürür.
Şema Tanımlama
Ve şimdi şemayı oluşturalım. Tanımlamak için Nette\Schema\Expect sınıfı kullanılır, aslında
verilerin nasıl görünmesi gerektiğine dair beklentileri tanımlarız. Giriş verilerinin, processRefund
türünde
bool ve refundAmount
türünde int öğeleri içeren bir yapı (örneğin bir dizi) oluşturması gerektiğini
varsayalım.
Şema tanımının, ilk kez görseniz bile anlaşılır göründüğüne inanıyoruz.
Doğrulama için aşağıdaki verileri gönderelim:
Çıktı, yani $normalized
değeri, bir stdClass
nesnesidir. Çıktının bir dizi olmasını
isteseydik, şemayı Expect::structure([...])->castTo('array')
tür dönüşümüyle tamamlardık.
Yapının tüm öğeleri isteğe bağlıdır ve varsayılan değeri null
'dur. Örnek:
Varsayılan değerin null
olması, giriş verilerinde 'processRefund' => null
'ın kabul edileceği
anlamına gelmez. Hayır, giriş bir boolean olmalıdır, yani yalnızca true
veya false
.
null
'a izin vermek için bunu Expect::bool()->nullable()
ile açıkça belirtmemiz gerekirdi.
Bir öğeyi Expect::bool()->required()
ile zorunlu kılabiliriz. Varsayılan değeri örneğin
Expect::bool()->default(false)
ile false
olarak veya kısaca Expect::bool(false)
ile
değiştirebiliriz.
Peki ya boolean'a ek olarak 1
ve 0
'ı da kabul etmek isteseydik? O zaman ayrıca boolean'a
normalleştirilmesini sağlayacağımız değerlerin bir listesini belirtiriz:
Artık şemanın nasıl tanımlandığının ve yapının bireysel öğelerinin nasıl davrandığının temellerini biliyorsunuz. Şimdi şema tanımlarken kullanılabilecek diğer tüm öğeleri göstereceğiz.
Veri Tipleri: type()
Şemada tüm standart PHP veri tipleri belirtilebilir:
Ve ayrıca Validators sınıfı tarafından desteklenen tüm
türler, örneğin Expect::type('scalar')
veya kısaca Expect::scalar()
. Ayrıca sınıf veya
arayüz adları, örneğin Expect::type('AddressEntity')
.
Union gösterimi de kullanılabilir:
Varsayılan değer, boş bir dizi olduğu array
ve list
hariç her zaman null
'dur.
(Liste, sıfırdan başlayarak artan bir dizi sayısal anahtara göre indekslenmiş bir dizidir, yani ilişkisel olmayan
bir dizi).
Değer Dizileri: arrayOf() listOf()
Dizi çok genel bir yapıdır, tam olarak hangi öğeleri içerebileceğini belirtmek daha kullanışlıdır. Örneğin, öğeleri yalnızca dizeler olabilen bir dizi:
İkinci parametre ile anahtarlar belirtilebilir (sürüm 1.2'den itibaren):
Liste, indekslenmiş bir dizidir:
Parametre bir şema da olabilir, bu yüzden yazabiliriz:
Varsayılan değer boş bir dizidir. Bir varsayılan değer belirtirseniz, iletilen verilerle birleştirilecektir. Bu,
mergeDefaults(false)
ile devre dışı bırakılabilir (sürüm 1.1'den itibaren).
Enum: anyOf()
anyOf()
, bir değerin alabileceği değerlerin veya şemaların bir listesini temsil eder. Bu şekilde, öğeleri
'a'
, true
veya null
olabilen bir öğe dizisi yazarız:
Enum öğeleri şemalar da olabilir:
anyOf()
metodu, varyantları bir dizi olarak değil, bireysel parametreler olarak kabul eder. Ona bir değer
dizisi iletmek istiyorsanız, unpacking operatörünü anyOf(...$variants)
kullanın.
Varsayılan değer null
'dur. firstIsDefault()
metoduyla ilk öğeyi varsayılan yaparız:
Yapılar
Yapılar, tanımlanmış anahtarlara sahip nesnelerdir. Her anahtar ⇒ değer çifti „özellik“ olarak adlandırılır:
Yapılar dizileri ve nesneleri kabul eder ve stdClass
nesneleri döndürür.
Varsayılan olarak, tüm özellikler isteğe bağlıdır ve varsayılan değeri null
'dur. Zorunlu özellikleri
required()
ile tanımlayabilirsiniz:
Çıktıda varsayılan değere sahip özellikleri istemiyorsanız, skipDefaults()
kullanın:
null
, optional
özelliğinin varsayılan değeri olmasına rağmen, giriş verilerinde izin verilmez
(değer bir dize olmalıdır). null
kabul eden özellikleri nullable()
ile tanımlarız:
Yapının tüm özelliklerinin dizisini getShape()
metodu döndürür.
Varsayılan olarak, giriş verilerinde ekstra öğe olamaz:
Bunu otherItems()
ile değiştirebiliriz. Parametre olarak, ekstra öğelerin doğrulanacağı şemayı
belirtiriz:
extend()
kullanarak başka bir yapıdan türeterek yeni bir yapı oluşturabilirsiniz:
Diziler
Tanımlanmış anahtarlara sahip dizi. Yapılar için geçerli olan her şey onun için de geçerlidir.
Tuple olarak bilinen indekslenmiş bir dizi de tanımlanabilir:
Kullanımdan Kaldırılmış Özellikler
Bir özelliği deprecated([string $message])
metoduyla kullanımdan kaldırılmış olarak işaretleyebilirsiniz.
Destek sonu bilgileri $processor->getWarnings()
ile döndürülür:
Aralıklar: min() max()
min()
ve max()
kullanarak dizilerdeki öğe sayısını sınırlayabiliriz:
Dizeler için uzunluklarını sınırlayabiliriz:
Sayılar için değerlerini sınırlayabiliriz:
Elbette, yalnızca min()
veya yalnızca max()
belirtmek mümkündür:
Düzenli İfadeler: pattern()
pattern()
kullanarak, tüm giriş dizesinin eşleşmesi gereken bir düzenli ifade belirtebiliriz (yani,
^
ve $
karakterleriyle sarılmış gibi):
Özel Kısıtlamalar: assert()
Diğer tüm kısıtlamaları assert(callable $fn)
kullanarak belirtebiliriz.
Veya
Her kısıtlamaya kendi açıklamanızı ekleyebilirsiniz. Bu, hata mesajının bir parçası olacaktır.
Metot tekrar tekrar çağrılarak daha fazla kısıtlama eklenebilir. transform()
ve castTo()
çağrılarıyla serpiştirilebilir.
Dönüşümler: transform()
Başarıyla doğrulanmış veriler özel bir fonksiyon kullanılarak değiştirilebilir:
Metot tekrar tekrar çağrılarak daha fazla dönüşüm eklenebilir. assert()
ve castTo()
çağrılarıyla serpiştirilebilir. İşlemler, bildirildikleri sırayla gerçekleştirilir:
transform()
metodu aynı anda değeri hem dönüştürebilir hem de doğrulayabilir. Bu genellikle
transform()
ve assert()
zincirlemesinden daha basit ve daha az tekrarlıdır. Bu amaçla, fonksiyon,
doğrulama sorunları hakkında bilgi eklemek için kullanılabilecek addError()
metoduna sahip bir Context nesnesi alır:
Tür Dönüştürme: castTo()
Başarıyla doğrulanmış veriler tür dönüştürülebilir:
Yerel PHP türlerine ek olarak, sınıflara da tür dönüştürme yapılabilir. Bu, basit bir yapıcı olmayan sınıf mı yoksa yapıcı olan bir sınıf mı olduğuna bağlıdır. Sınıfın bir yapıcısı yoksa, örneği oluşturulur ve yapının tüm öğeleri özelliklere yazılır:
Sınıfın bir yapıcısı varsa, yapının öğeleri yapıcıya adlandırılmış parametreler olarak iletilir:
Skaler bir parametre ile birleştirilmiş tür dönüştürme, bir nesne oluşturur ve değeri yapıcıya tek bir parametre olarak iletir:
Normalizasyon: before()
Doğrulamadan önce veriler before()
metodu kullanılarak normalleştirilebilir. Örnek olarak, dize dizisi
olması gereken (örneğin ['a', 'b', 'c']
) ancak a b c
dizesi biçiminde girdi kabul eden bir öğeyi
ele alalım:
Nesnelere Eşleme: from()
Yapı şemasını bir sınıftan oluşturabiliriz. Örnek:
Anonim sınıflar da desteklenir:
Sınıf tanımından elde edilen bilgiler yeterli olmayabileceğinden, ikinci parametre ile öğelere kendi şemanızı ekleyebilirsiniz: