Ev / Linux'a Genel Bakış / Doğrulandı, doğrulandı... ve doğrulandı! PHP'deki veri doğrulayıcıların karşılaştırılması. PHP Insane doğrulama php kullanarak doğrulama ve veri temizleme

Doğrulandı, doğrulandı... ve doğrulandı! PHP'deki veri doğrulayıcıların karşılaştırılması. PHP Insane doğrulama php kullanarak doğrulama ve veri temizleme

Form gönderim verilerini daha ileri işlemler için almadan önce formunuza yapılan girişin doğrulanması çok önemlidir. Formda çok fazla alan olduğunda PHP doğrulama betiği çok karmaşık hale gelir. Üstelik, yaptığınız formların çoğu için aynı veya benzer doğrulamayı yaptığınızdan, form doğrulamaları için çok fazla mükerrer çaba harcanır.

Bu genel PHP form doğrulama komut dosyası hakkında

Bu genel PHP form doğrulayıcı betiği, formunuza doğrulamalar eklemenizi çok kolaylaştırır.

Formdaki her öğeyle bir dizi "doğrulama tanımlayıcısı" oluşturup ilişkilendiririz. “Doğrulama tanımlayıcısı” gerçekleştirilecek doğrulama türünü belirten bir dizedir. Örneğin, "req" gerekli anlamına gelir, "alfa" yalnızca alfabetik karakterlere izin verilir vb. anlamına gelir.

Formdaki her alanın sıfır, bir veya daha fazla doğrulaması olabilir. Örneğin, giriş boş olmamalı, 25 karakterden az olmalı, alfasayısal vb. olmalıdır.

Formdaki her giriş alanı için bir dizi doğrulama tanımlayıcısını ilişkilendirebilirsiniz.

PHP form doğrulama komut dosyasını indirin

PHP form doğrulama komut dosyasını aşağıdan indirebilirsiniz:
Zip dosyası form doğrulama komut dosyası formvalidator.php'yi, belgeleri ve kullanım örneklerini içerir.

PHP form doğrulama komut dosyasını kullanma
  • formvalidator.php'yi form işleme komut dosyanıza ekleyin
  • require_once "formvalidator.php"
  • Bir FormValidator nesnesi oluşturun ve form doğrulama tanımlayıcılarını ekleyin.
  • $doğrulayıcı = new FormValidator(); $validator->addValidation("İsim", "req", "Lütfen Adı giriniz"); $validator->addValidation("Email","email", "E-posta girişi geçerli bir e-posta değeri olmalıdır"); $validator->addValidation("Email", "req", "Lütfen E-postayı doldurun");

    İlk argüman formdaki giriş alanının adıdır. İkinci argüman, gerekli doğrulamanın türünü söyleyen doğrulama tanımlayıcısıdır. Üçüncü argüman, doğrulama başarısız olursa görüntülenecek hata mesajıdır.

  • ValidateForm() işlevini çağırarak formu doğrulayın
  • if(!$validator->ValidateForm()) ( echo "Doğrulama Hataları:"; $error_hash = $validator->GetErrors(); foreach($error_hash as $inpname => $inp_err) ( echo "

    $inpname: $inp_err

    \n"; )) Örnek

    Aşağıdaki örnek fikri daha net hale getirecek

    Ad: E-posta:

    Özel Doğrulama Ekleme

    Doğrulama tanımlayıcıları tarafından sağlanmayan özel bir doğrulama eklemek istiyorsanız bunu yapabilirsiniz. İşte adımlar:

  • Özel doğrulama için bir sınıf oluşturun ve DoValidate() işlevini geçersiz kılın
  • class MyValidator, CustomValidator'ı genişletir ( function DoValidate(&$formars,&$error_hash) ( if(stristr($formars["Comments"],"http://")) ( $error_hash["Comments"]="URL'ye izin verilmez yorumlarda"; false değerini döndür; ) true değerini döndür; ))

  • Özel doğrulama nesnesini ekleyin
  • $doğrulayıcı = new FormValidator(); $validator->addValidation("İsim", "req", "Lütfen Adı giriniz"); $validator->addValidation("Email","email", "E-posta girişi geçerli bir e-posta değeri olmalıdır"); $validator->addValidation("Email", "req", "Lütfen E-postayı doldurun"); $custom_validator = new MyValidator(); $validator->AddCustomValidator($custom_validator);

    Özel doğrulama işlevi, diğer doğrulamalardan sonra otomatik olarak çağrılacaktır.

    Doğrulama Tanımlayıcıları Tablosu

    Tüm doğrulama tanımlayıcılarının listesi aşağıdadır:

    Doğrulama TanımlayıcısıKullanım
    talepAlan boş olmamalıdır
    maxlen=???girilen verilerin uzunluğunu maksimuma kadar kontrol eder. Örneğin, izin verilen maksimum boyut 25 ise doğrulama tanımlayıcısını "maxlen=25" olarak verin.
    minlen=???Girilen dizenin uzunluğunu gerekli minimum seviyeye kadar kontrol eder. örnek “minlen=5”
    yıllıkVerilerin alfabetik veya sayısal karakterler dışında başka karakterler içerip içermediğini kontrol edin
    alnum_sYalnızca alfabetik, sayısal ve boşluk karakterlerine izin verir
    sayıSayısal verileri kontrol edin
    alfaAlfabetik verileri kontrol edin.
    alfa_larAlfabetik verileri kontrol edin ve boşluklara izin verin.
    e-postaAlan bir e-posta alanıdır ve verilerin geçerliliğini doğrular.
    lt=???
    daha az=???
    Verilerin iletilen değerden küçük olduğunu doğrulayın. Yalnızca sayısal alanlar için geçerlidir.
    örnek: değerin 1000'den küçük olması gerekiyorsa doğrulama açıklamasını “lt=1000” olarak verin
    gt=???
    büyüktür=???
    Verilerin iletilen değerden büyük olduğunu doğrulayın. Yalnızca sayısal alanlar için geçerlidir.
    örnek: değerin 10'dan büyük olması gerekiyorsa doğrulama açıklamasını "gt=10" olarak verin
    normal ifade=???Normal bir ifadeyle değerin normal ifadeyle eşleşmesi gerektiğini kontrol edin.
    örnek: “regexp=^(1.20)$” en fazla 20 alfabetik karaktere izin verir.
    seçmeyin=??Bu doğrulama tanımlayıcısı seçili giriş öğeleri (listeler) içindir. Normalde, seçim listesi kutularında 'Birini Seç' yazan bir öğe bulunur. Kullanıcı bu seçeneğin dışında bir seçenek seçmelidir. Bu seçeneğin değeri 'Birini Seçin' ise doğrulama açıklaması "dontselect=Birini Seçin" olmalıdır
    seçmeBu doğrulama tanımlayıcısı onay kutuları içindir. Kullanıcı verilen onay kutusunu seçmemelidir. ?? yerine onay kutusunun değerini belirtin.
    Örneğin, donselectchk=on
    olmalıBu doğrulama tanımlayıcısı onay kutuları içindir. Kullanıcı verilen onay kutusunu seçmelidir. ?? yerine onay kutusunun değerini belirtin.
    Örneğin, Shouldselchk=on
    radyoyu seçmeBu doğrulama tanımlayıcısı radyo düğmeleri içindir. Kullanıcı verilen radyo düğmesini seçmemelidir. ?? yerine radyo düğmesinin değerini girin.
    Örneğin, radyoyu seçmeyin=HAYIR
    radyo seçBu doğrulama tanımlayıcısı radyo düğmeleri içindir. Kullanıcı verilen radyo düğmesini seçmelidir. ?? yerine radyo düğmesinin değerini girin.
    Örneğin, radyo seç=evet
    selmin=??Bir onay kutusu grubundan en az n sayıda onay kutusunu seçin.
    Örneğin: selmin=3
    yalnızRadyo grubunu zorunlu kılar. Kullanıcı radyo grubundan en az bir öğe seçmelidir.
    eqelmnt=???formdaki iki öğeyi karşılaştırın ve değerlerin aynı olduğundan emin olun. Örneğin, 'şifre' ve 'şifreyi onayla'. ???'yı değiştirin diğer giriş öğesinin adıyla birlikte.
    Örneğin: eqelmnt=confirm_pwd

    Önceki bir makalede kendi kütüphanemin mevcut diğer çözümlerle bir karşılaştırmasını yazacağıma söz vermiştim, bu yüzden bugün Aura.Filter, Respect Validation, Sirius Validation ve Valitron kullanarak doğrulamaya bakacağız.


    Kullanıcıların kayıt edilmesini içeren, geliştirme aşamasında olan belirli bir kamu hizmetimizin olduğunu hayal edelim. tam erişim tüm işlevlere. Böylece kayıt formu aşağıdaki alanları içerecektir:

  • isim.
  • Birincisi kullanıcının adı ve ikincisi soyadı olmak üzere tam olarak iki kelime içermelidir.
  • giriş yapmak. Bir değer iletilirse yalnızca Latin harfleri, kısa çizgiler ve alt çizgilerden oluşmalıdır..
  • e-posta. Geçerli bir adres içermelidir
  • E-posta
  • şifre.


    Ayarlanmalı ve 64 karakterden uzun olmamalıdır.

    kabul.

    Kullanıcının hizmet şartlarını kabul ettiğini onaylamak için işaretlemesi gereken tipik bir onay kutusu.

    Yani hayali hizmetimize kaydolmak için kullanıcının doldurması gereken beş alanımız var. Giriş olarak tamamen geçersiz veriler aldığımızı düşünelim:

  • $data = [ "isim" => "Albert", // İki kelime olmalı "giriş" => "@lbert", // "Yasak" karakter @ "e-posta" => "yanlış bir şey", / / ​​Olmalı bir e-posta "şifresi" olun => Aura.Filter
  • Aura.Filter kullanarak doğrulama bir filtre fabrikasıyla başlar. Bireysel bir değeri değil, bir diziyi doğrulayacağımız için "konu filtresi" adı verilen bir filtre oluşturmamız gerekiyor.
  • Aura\Filter\FilterFactory kullanarak kuralları tanımlarız; $filter = (yeni FilterFactory)->newSubjectFilter(); $filter->validate("name") ->isNotBlank() ->is("two_words") ->setMessage("Ad iki kelimeden oluşmalıdır."); $filter->validate("login") ->isBlankOr("alnum") ->setMessage("Bir kullanıcı adı belirtirseniz, yalnızca Latin karakterleri içermelidir."); $filter->validate("email") ->isNotBlank() ->is("email") ->setMessage("Lütfen geçerli bir e-posta adresi girin."); $filter->validate("password") ->isNotBlank() ->is("strlenMax", 64) ->setMessage("Lütfen şifrenizi yazınız."); $filter->validate("kabul edildi") ->is("geri arama", function($konu, $alan) ( return $konu->($alan) === true; ))->setMessage("Gerekli Hizmet şartlarını kabul ediyorum.");
  • Gördüğünüz gibi kuralların açıklaması oldukça basit. Aura.Filter, kutudan çıkmış bir dizi yararlı kural sağlar ve bunlardan bazıları yukarıdaki örnekte kullanılmıştır:
  • isNotBlank yöntemi. Alanın boş bir değere sahip olamayacağını belirtir. albüm. Bu kural yalnızca Latin harflerine izin verir. e-posta. Ve bu çok açık :)
  • Two_words kuralını belirtmediğimi muhtemelen fark etmişsinizdir. Aura.Filter'da doğal olarak böyle bir kural yok, o yüzden bir tane oluşturmamız gerekiyor. Belgelerde belirtildiği gibi bu, kural için ayrı bir sınıf kullanılarak yapılır:


    /** * Kullanıcı adını doğrulayan kural. * Kullanıcı adı iki kelimeden oluşur: ad ve soyadı, bir boşlukla ayrılmış. */ class KullanıcıAdıRule ( /** * Kullanıcı adını doğrular. * * @param object|array $subject * @param string $field * @param int $max * * @return bool */ public function __invoke($konu, $field) , $max = null) ( $value = $konu->($field); if (! is_scalar($value)) ( return false; ) return (bool) preg_match("/^+\s+$/u", $değer);

    İkinci adım, filtre fabrikasına yeni kuralımız hakkında bilgi vermektir. Bu, ilk argümanın bir kurallar dizisi olarak filtre fabrikasına iletilmesiyle yapılır:


    Bir sonraki adım Aura.Filter'a yeni bir kural oluşturduğumuzu ve onu kullanmak istediğimizi bildirmektir. Bu, fabrikanın ilk argümanına bir dizi kural iletilerek yapılır:


    Aura\Filter\FilterFactory'yi kullanın; $kurallar = [ "iki_kelime" => işlev() ( yeni KullanıcıAdıKuralını döndür; ) ]; $filter = (new FilterFactory($rules))->newSubjectFilter();

    Artık two_words kuralımız diğer standart kurallarla aynı şekilde kullanılabilir.

    Geri bildirim

    Hatırlayacağınız gibi doğrulama yaptığımız veriler tamamen geçersizdir, çünkü her alan yanlış değer içermektedir veya hiç içermemektedir. Bu nedenle, doğrulama sonucunda hatalar ve bunlarla ilgili mesajlar alacağımız varsayılmaktadır.


    Aura.Filter ile şu şekilde doğrulama yapıyoruz:


    $geçerli = $filtre->uygula($veri); if (! $geçerli) ( $başarısızlıklar = $filtre->getFailures(); $mesajlar = $başarısızlıklar->getMessages(); )

    İÇİNDE $mesajlar bir dizi yazılıyor, dolayısıyla mesajları görüntülemek için iç içe geçmiş iki foreach'a ihtiyacımız var:


    Doğrulamaya Saygı Göster

    Karşılaştırmada kullandığım ikinci kütüphane ise Respect Validation adı verilen nispeten popüler bir çözüm. İnsanlar ona güvendiği için orada görülecek bir şey olduğunu düşünüyorum.


    Deneyin saflığı için kütüphaneleri karşılaştırırken başlangıçta tanımlanan aynı veri setini kullanacağız:


    Respect\Validation\Validator'ı v olarak kullanın; $data = [ "isim" => "Albert", // İki kelime olmalı "giriş" => "@lbert", // "Yasak" karakter @ "e-posta" => "yanlış bir şey", / / ​​Olmalı buraya bir e-posta yazın "şifre" => "" // Şifre hiç belirtilmedi // kullanıcı kutuyu işaretlemediğinden "kabul edildi" dizide yok ]; Kuralların tanımlanması

    Aura.Filter'da olduğu gibi, kullanıcı adı için kendi doğrulama kuralımıza ihtiyacımız var, o yüzden oradan başlayalım:


    ad alanı MyNamespace; Saygı\Validation\Rules\AbstractRule'u kullanın; class UserNameRule, AbstractRule'u genişletir ( public function validate($input) ( return (bool) preg_match("/^+\s+$/u", $input); ) )

    Harici kurallar API'si Aura.Filter ile neredeyse aynıdır; __invoke() büyüsü yerine yalnızca validate() yöntemi kullanılır. Bana bu API daha basit ve daha anlaşılır geldi. Eh, Kontrolio'ya daha yakın :)


    Belgelerde bununla ilgili herhangi bir söz bulamadım, ancak kuralın kendisine ek olarak bunun için kendi istisna türünüzü oluşturmanız gerekir. İstisna sınıfının adı, kural sınıfının adından ve bir son ekten oluşmalıdır İstisna.


    Respect\Validation\Exceptions\NestedValidationException'ı kullanın; UserNameRuleException sınıfı NestedValidationException'ı genişletir ( // )

    Sonunda verilerimizi doğrulayabiliriz. Öncelikle yeni kuralımızı doğrulayıcıya iletiyoruz ki onun da bundan haberdar olması ve gelecekte kullanabilmemiz için. Saygı Doğrulamasında bu, standart olmayan kuralların bulunduğu ad alanını ileterek with() yöntemi çağrılarak yapılır.


    v::with("MyNamespace\\");

    Artık standart olmayan tüm kurallar ad alanında yer alıyor MyNamespace, doğrulayıcı tarafından "tanınacaktır". Bir sonraki adım gerekli kuralları tanımlamak ve doğrulamayı gerçekleştirmektir.


    v::attribute("name", v::userNameRule()) ->attribute("login", v::alnum("-_")) ->attribute("email", v::email()) ->attribute("password", v::notEmpty()->stringType()->length(null, 64)) ->attribute("kabul edildi", v::trueVal()) ->assert((object) $veri);

    Kuralımızı özelliğe nasıl uyguladığımıza dikkat edin isim. Burada kural sınıfının adı, doğrulayıcı yöntemin adına dönüştürülmüştür. Geri kalan kurallar genel olarak sezgiseldir.


    Diziyi neden sağladığımızı ayrıca belirtmekte fayda var $veri nesneye. Gerçek şu ki, Saygı Doğrulaması girdi olarak dizileri değil nesneleri kabul eder. Bu kütüphaneyi kullanarak geliştirme yaparken bu dikkate alınmalıdır.

    Geri bildirim

    Aura.Filter'ın aksine Respect doğrulayıcı, doğrulama başarısız olduğunda bir istisna atar. Ve bu istisna, doğrulama hata mesajlarını içerir. Bu nedenle, az önce gösterilen örneğin şu şekilde yazılması gerekir:


    try ( v::with("RespectValidationExample\\"); v::attribute("name", v::userNameRule()) ->attribute("login", v::alnum("-_")) - >attribute("email", v::email()) ->attribute("password", v::notEmpty()->stringType()->length(null, 64)) ->attribute("kabul edildi", v::trueVal()) ->assert((object) $data ) catch (NestedValidationException $ex) ( $messages = $ex->getMessages(); )

    getMessages()'ı kullanarak, doğrulayıcının doğrulama işlemi sırasında topladığı tüm mesajların düz bir dizisini elde edeceğiz. Diziyi boşalttığımızda şöyle bir şey elde ederiz:


    array(5) ( => string(29) “%s için veri doğrulaması başarısız oldu” => string(60) “giriş yalnızca harfler (a-z), rakamlar (0–9) ve “-_” içermelidir” => string (25) “e-posta geçerli bir e-posta olmalıdır” => string(26) “şifre boş olmamalıdır” => string(32) “Kabul edilen özellik mevcut olmalıdır” )

    Mesajları kendinize göre değiştirebilirsiniz. Belki bu kitaplığı bir şekilde yanlış anladım, ancak bu süreç bana o kadar açık gelmedi: iletileri nitelikler için değil kurallar için tanımladığınız, işlenmiş bir istisna üzerinde findMessages() yöntemini kullanmanız gerekir.


    $ex->findMessages([ "userNameRule" => "Kullanıcı adı iki kelimeden oluşmalıdır.", "alnum" => "Giriş bilgilerinizi beğenmiyoruz.", "email" => "Belli ki sevmiyorsunuz bize e-posta adresinizi vermek istiyorsunuz.", "notEmpty" => "Peki, şifreniz nerede?", "agred" => "Kabul etmemeniz çok yazık." ]);

    Sorunun ne olduğunu bilmiyorum ama hala anlamadığım birkaç şey var. Kuralları yukarıdaki şekilde tanımlayarak elde ettiğimiz şey budur:


    array(5) ( => string(40) “Kullanıcı adı iki kelimeden oluşmalıdır.” => string(31) “Giriş bilgilerinizi beğenmiyoruz.” => string(25) “e-posta geçerli bir e-posta olmalıdır” = > string(5) "Peki, şifreniz nerede?" => string(9) "Kabul etmemeniz çok yazık."

    Gördüğünüz gibi e-posta alanına yönelik mesaj uygulanmadı, standart olan kaldı. Ancak indeks 4'teki mesaj tam tersi! Ve bu, kuralın adını değil alanın adını kullanmama rağmen. Oysa kural adını (trueVal) kullansaydım mesajım bir yerlerde kaybolurdu. Bu kütüphanenin deneyimli kullanıcılarının yorumları memnuniyetle karşılanacaktır.

    Sirius Doğrulaması

    Tamam, bir sonraki kütüphaneye geçelim ve onun benzer görevleri nasıl yerine getirdiğini görelim.

    Kuralların tanımlanması

    Kullanıcı adı için bir kez daha kural tanımlamamız gerekiyor. Buna şöyle bir şey yazacağız:


    class UserNameRule extends AbstractRule ( // Hata Mesajları const MESSAGE = "Kullanıcı adı iki kelimeden oluşmalıdır."; const LABELED_MESSAGE = "(etiket) iki kelimeden oluşmalıdır."; public function validate($değer, $değerIdentifier = null ) ( return (bool) preg_match("/^+\s+$/u", $değer) ) )

    Lütfen daha önce tartışılan kütüphanelerle karşılaştırıldığında yaklaşımlardaki farklılığa dikkat edin. Özellikleri, yöntemleri veya kural argümanlarını kullanmak yerine iki tür mesajı sabitlerde tanımlarız.


    Şimdi doğrulama mantığını anlatalım:


    $doğrulayıcı = yeni Doğrulayıcı; $validator ->add("name", "required | MyApp\Validation\Rule\UserNameRule") ->add("login", "required | alphanumhyphen", null, "Giriş yalnızca Latin harfleri, tireler ve alt çizgileri içerebilir. ") ->add("e-posta", "gerekli | e-posta", null, "Lütfen doğru bir e-posta girin.") ->add("şifre", "gerekli | maksimum uzunluk(64)", null, "Sizin şifreniz efendim.") ->add("katılıyorum", "gerekli | eşittir(doğru)", null, "Neden kabul etmediniz?");

    Gördüğünüz gibi kurallar seti çok basit ve okunabilir. Açıklama için yatay çubuklarla ayrılmış adlar kullanırız. Bu yaklaşım Laravel ve Kontrolio'da kullanılana benzer.


    add() yönteminin dördüncü argümanı, doğrulama başarısız olursa Sirius'un kullanacağı doğrulama hata mesajını açıklar. Yeni kuralımız için neden bir mesaj eklemedik? KullanıcıAdıKural?


    $validator->add("isim", "gerekli | Uygulamam\Doğrulama\Kural\KullanıcıAdıRule")

    Bunun nedeni mesajların zaten sınıf sabitlerinde tanımlanmış olmasıdır:


    class UserNameRule extends AbstractRule ( // Hata mesajları const MESSAGE = "Kullanıcı adı iki kelimeden oluşmalıdır."; ...

    Başka bir seçenek de doğrulayıcının addMessage() yöntemini kullanmaktır:


    $validator->addMessage("email", "Lütfen geçerli bir e-posta girin.");

    Özel kuralların sınıflarının tam adıyla tanımlandığını, Kontrolio'da ise bir takma ad/takma ad belirtebileceğinizi lütfen unutmayın.

    Geri bildirim

    Doğrulamayı gerçekleştirmek için, ona veri aktararak doğrulama yöntemini validate() çağırırız:


    $data = [ "isim" => "Albert", // İki kelime olmalı "giriş" => "@lbert", // "Yasak" karakter @ "e-posta" => "yanlış bir şey", / / ​​Olmalı buraya bir e-posta yazın "şifre" => "" // Şifre hiç belirtilmedi // kullanıcı kutuyu işaretlemediğinden "kabul edildi" dizide yok ]; $validator->validate($veri);

    Respect'in aksine, Sirius bir istisna atmayacak, sadece geri dönecektir YANLIŞ. Doğrulama hata mesajları getMessages() doğrulama yöntemi aracılığıyla elde edilebilir. Hataları özniteliklere göre gruplandırılmış olarak döndürür, bu nedenle hataların üzerinden geçmek için iki foreach döngüsüne ihtiyacımız var:


    foreach ($validator->getMessages() as $attribute => $messages) ( foreach ($messages as $message) ( echo $message->getTemplate() . "\n"; ) )

    Burada $message bir sınıf nesnesidir Sirius\Doğrulama\HataMesajıİhtiyacımız olan mesajı döndüren getTemplate() yöntemine sahip.

    ValitronKuralların tanımlanması

    İlk fark: Yeni bir kural eklemek için ayrı bir sınıf oluşturmanıza gerek yoktur. Boole sonucunu döndüren bir kapatma kullanabilirsiniz.


    Özel kurallar eklemek için Valitron'un, ilk iki argümanın gerekli olduğu ve üçüncüsünün isteğe bağlı olduğu statik bir addRule() yöntemi vardır. Kural tanımlayıcıyı, mantığı ve hata mesajını tek bir yerde gösterdiği için bu yöntemi beğendim.


    Valitron\Validator'ı kullanın; Validator::addRule("two_words", function($field, $value) ( ​​​return (bool) preg_match("/^+\s+$/u", $value); ), "Kullanıcı adı tam olarak aşağıdakilerden oluşmalıdır: iki kelime ");

    İkinci fark, kuralların niteliklere nasıl uygulandığıdır. Önceki tüm durumlarda, bir niteliğin adeta birincil bir şey olduğunu gördük.


    Valitron farklı bir yol izledi ve doğrulama kurallarını ilk sıraya koydu. Kuralları tanımlayarak, bu kurallara nitelikler uyguluyormuş gibi görünüyorsunuz; bunun tersi geçerli değil.


    $doğrulayıcı = new Doğrulayıcı($veri); $validator ->rule("iki_kelime", "isim")->etiket("") ->kural("gerekli", [ "isim", "giriş", "e-posta", "şifre", "kabul edildi" ] ) ->kural("bilgi", "giriş") ->kural("e-posta", "e-posta") ->kural("kabul edildi", "kabul edildi");

    Örnekte görüldüğü gibi rule() yönteminde önce kuralın adını yazıyoruz ve ancak daha sonra bu kurala karşılık gelmesi gereken nitelikleri belirtiyoruz. Daha açık bir örnek, niteliklerin bu kurala nasıl "ait" olduğunu gösteren zorunlu kuraldır.


    Valitron (incelediğimiz diğer çözümler gibi) standart hata mesajları sağlar. Bunları yalnızca kullanırsanız, her mesajın ilgili özelliğin adıyla başladığını göreceksiniz.


    Valitron, standart dışı hata mesajları kullanıldığında bile mesaj metninde nitelik adlarını değiştirir. Bu nedenle nitelik adını kaldırmak için boş bir dizeyle label() yöntemini kullandık.


    $validator->rule("two_words", "name")->label("")

    Özellikle doğrulamayla ilgili olarak Valitron kütüphane API'si, makalede daha önce gördüklerimizden neredeyse hiç farklı değildir. Doğrulamayı gerçekleştirmek için doğrulama yöntemini validate() olarak adlandırırız:


    $doğrulayıcı->doğrula();

    Doğrulama hata mesajları getErrors() yöntemi kullanılarak alınabilir:


    $doğrulayıcı->hatalar();

    Buradaki mesajlar, mesaj için ayrı bir sınıf olmaması ve düzenli, çok boyutlu bir dizi elde etmemiz dışında, Sirius Doğrulama'dakiyle aynı şekilde niteliklere göre gruplandırılır.


    foreach ($validator->errors() as $attribute => $messages) ( foreach ($messages as $message) ( echo $message . "\n"; ) ) Kontrolio

    Ve son olarak bugünün son kütüphanesi Kontrolio adlı kendi geliştirmemdir.

    Kuralların tanımlanması

    Yine beşinci kez kullanıcı adı için doğrulama kuralı oluşturacağız. Her şey nispeten basit ve standarttır:


    ad alanı MyProject\Validation\Rules; Kontrolio\Rules\AbstractRule'u kullanın; class TwoWords extends Kontrolio\Rules\AbstractRule ( public function isValid($input = null) ( return (bool) preg_match("/^+\s+$/u", $input); ) )

    Şimdi bir fabrika yaratıyoruz ve extend() yöntemini kullanarak içine bir kural kaydediyoruz:


    ad alanı MyProject; Kontrolio\Factory'yi kullanın; MyProject\Validation\Rules\TwoWords'u kullanın; $factory = Kontrolio\Factory::getInstance()->extend();

    Kuralı kaydettikten sonra, isme göre - iki_kelime dahil olmak üzere onu kullanabiliriz. Bir doğrulayıcı oluşturalım:


    $data = [ "isim" => "Albert", // İki kelime olmalı "giriş" => "@lbert", // "Yasak" karakter @ "e-posta" => "yanlış bir şey", / / ​​Olmalı buraya bir e-posta yazın "şifre" => "" // Şifre hiç belirtilmedi // kullanıcı kutuyu işaretlemediğinden "kabul edildi" dizide yok ]; $rules = [ "isim" => "iki_kelime", "giriş" => "bazen|alphadash", "email" => "e-posta", "şifre" => "uzunluk:1,64", "kabul edildi" = > " kabul edilmiş" ]; $messages = [ "name" => "Kullanıcı adı iki kelimeden oluşmalıdır.", "login" => "Giriş bilgilerinizi beğenmiyoruz.", "email" => "Belli ki vermek istemiyorsunuz bize e-posta adresinizi .", "password" => "Peki, şifreniz nerede?", "kabul ediyorum" => "Kabul etmemeniz çok yazık." ]; $doğrulayıcı = $fabrika->make($veri, $kurallar, $mesajlar);

    Kuralları Laravel'de kullanılana benzer bir sözdizimi kullanarak tanımladık, ancak daha ayrıntılı bir versiyon da kullanabilirdik:


    $rules = [ "isim" => new TwoWords, "giriş" => , "email" => yeni E-posta, "şifre" => new Uzunluk(1, 64), "kabul edildi" => yeni Kabul edildi ]; Geri bildirim

    Doğrulama aynı validate() yöntemi kullanılarak başlatılır:


    $doğrulayıcı->doğrula();

    Artık getErrors() veya getErrorsList() yöntemlerinden birini kullanarak hata mesajları alabiliriz. İlk yöntem daha karmaşık hata çıktısına izin verirken ikincisi düz bir dizi döndürür. getErrors() işlevini kullanarak şuna benzer mesajların çıktısını alabiliriz:



    getErrorsList() ile daha basit bir mesaj listesi oluşturabilirsiniz:


    Sonuç olarak

    Bu makalede aşağıdaki kütüphanelerin kullanımına ilişkin örnekler gösterdim:

  • Aura.Filtre
  • Doğrulamaya Saygı Göster
  • Sirius Doğrulaması
  • Valitron
  • kontrol
  • "Gerçek dünyadan bir örnek" çok basit görünebilir. Buna katılıyorum çünkü gerçekten de bazı kütüphane özellikleri makalenin dışında bırakıldı. Prensip olarak, eğer ilgileniyorsanız, özelliklerini kendiniz inceleyebilirsiniz.


    Her kütüphanenin kendine has özellikleri ve karanlık tarafları var, bu yüzden birini seçmenin zevk ve zorluk meselesi olduğunu düşünüyorum.


    Okuduğunuz için teşekkürler. Doğru seçimi yap.

    Etiketler: Etiket ekleyin

    Herkese iyi akşamlar (daha çok gece gibi - editörün notu). Bugün bunu biraz geliştireceğiz. Öncelikle PHP'de form doğrulamanın nasıl yapıldığını öğrenelim ve bazı güvenlik manipülasyonlarını yapalım.

    Bu nedenle, aşağıdaki koda bakın ve aşağıdaki değişiklikleri ve değişikliklerin aşağıdaki nedenlerini not edin. Tüm yeni satırları renkle vurguladım.

    Form alanlarının adı değiştirildi. Şunu sorabilirsiniz: buna neden ihtiyacımız var? Çok basit, sana cevap vereceğim. Bildiğim kadarıyla bazı spam botları form arayan siteleri tarıyor ve formları bu alanların adlarına göre dolduruyor. Teorik olarak eğer bir eşleşme bulamazlarsa evlerine giderler, bizim istediğimiz de budur. Elbette bu korumanın derecesinin çok iyi olduğunu düşünmüyorum ama bize zarar vermez ve spam e-postalar 1 harf azalırsa bu iyi olur =).

    E-posta adresinin doğru girilip girilmediği kontrol ediliyor. 17. satır, bize olumlu bir yanıt verilmesi durumunda kontrol edilecek olan elseif operatörünü kullanıyor, yani e-posta adresinin hiç eksik olduğunu, yani girilmediğini söylüyor. Burada girilen adresi karşılaştırmamızı sağlayan preg_match fonksiyonunu kullanıyoruz. Düzenli ifade. Belki daha sonra düzenli ifadeler hakkında kısaca yazarım ama şimdilik şunu bilmekte fayda var. Düzenli ifade dizemizin kontrol edileceği bir şablon oluşturur. Ve eğer bizim durumumuzda girilen adres ifadeyle eşleşmiyorsa, o zaman tekrar bir hata görüntülenecektir. Örneğin, burada birkaç normal ifade daha var:
    |^[-а-яе\s\.,;:\?!]+$|i– bu normal ifade yalnızca Rus alfabesini ve boşluk, nokta, virgül vb. gibi bazı karakterleri kullanmanıza olanak tanır.
    #http://[-a-z0-9_.]+[-a-z0-9_:@&?=+,.!/~*’%$]*\.(html?|php)#i– ve bu ifade, İnternet'teki bir adresin doğru yazılışını kontrol etmenizi sağlar.

    Daha sonra, bir mektup göndermek için tüm kodumuzun zaten aktarıldığı else operatörünü kullanıyoruz. İstediğiniz miktarda doğrulama kurallarını kendiniz oluşturabilirsiniz, örneğin bir e-posta adresini kontrol etmek için yenilerini eklemeniz yeterlidir; mutlu olursunuz.




    İrtibat kurulacak kişi:



    İletişim E-posta:



    İleti:






    Yabancı hiçbir şeye başvurmadan PHP formlarınızı bu şekilde doğrulayabilirsiniz. Bir dahaki sefere formlar konusundaki bir yazıda jQuery'deki formların doğrulanmasının ele alınacağını düşünüyorum. Bu arada yorumlarınızı ve dileklerinizi bekliyorum. Herkese iyi geceler ve mutlu sabahlar =).

    POST veya GET verilerinin doğrulanmasından bahsedeceğiz, ancak prensipte bu, çerezler gibi diğer yöntemlerle alınan verilere de uygulanabilir. Herhangi bir web uygulaması geliştirirken, kullanıcılarla etkileşim kurmak için bir arayüz yazmanız ve doğal olarak kullanıcıların sunucuya veri göndermesi için çeşitli formlar oluşturmanız gerekir. örneğin bunlar yorum olabilir. Alınan verilerin türe, boyuta ve belirtilen aralığa uyup uymadığının kontrol edilmesi gerektiğinin herkes için açık ve net olduğunu düşünüyorum. Öncelikle sistemin, web sitesinin veya veritabanının güvenliği için bu gereklidir, çünkü... Yanlış iletilen veriler veya kasıtlı olarak kötü oluşturulmuş bir istek, saldırganın erişimini açabilir.

    İkinci olarak, doğrulanmamış veriler yanlışsa komut dosyasının, sistemin veya tüm sunucunun dengesiz çalışmasına neden olabilir. Bu nedenle, tüm verilerin kontrol edilmesi ve iki kez kontrol edilmesi gerekiyor; belki birileri aşırı paranoyaya gerek olmadığını söyleyebilir, ancak bu konuda bunun aşırı olamayacağına inanıyorum.

    Hiçbir bahane altında, hiçbir koşulda kullanıcılardan alınan verilere güvenmeyin. Alınan verileri bir kez daha kontrol eden kodu yazamayacak kadar tembeliz ya da öyle olmasını umuyoruz mevcut yöntemler kontrol etmek yeterlidir, bunun sonucunda kendimize taviz veririz.

    Konudan küçük bir alıntı:
    Projeler üzerinde çalışmak, web siteleri, scriptler ve diğer sistemleri geliştirmek ve programlamak (çalışma süresi dışında) neredeyse boş zamanımın tamamını alıyor, yani bu işi günde mümkün olan maksimum saat boyunca yapıyorum. Zaman zaman eğlence için ya da sadece merak için bir şeyi test etmeye ihtiyaç duyulur. Sonuç olarak, ev yapımı motorlar veya eski versiyonların CMS'si kullanılarak aceleyle yapılan siteler, benzer test laboratuvarı fareleri haline gelir. Tabii ki, yukarıdakilerin tümü çarpık yazılmış kodlardan, veri kontrolü eksikliğinden muzdariptir ve çeşitli hatalarla doludur. Aslında, çoğu durumda, bu tür sitelerde yaptığım bir saatlik deneylerde, birçok ciddi güvenlik açığı bulmayı başardım ve bunların çoğu, alınan verilerin yetersiz doğrulanmasından kaynaklanıyor. İÇİNDE Son zamanlarda Bu genellikle JavaScript + Ajax'tan gelen POST verilerini işleyen komut dosyalarında bulunur.

    Görünen o ki, Ajax kullanarak bu komut dosyalarını yazan programcılar, tüm isteklerin arka planda, kullanıcının bilgisi olmadan veya sayfayı yeniden yüklemeden gerçekleştiği için, verilerin çok yakından kontrol edilmesine gerek olmadığına inanıyorlar.

    Kural olarak, bu senaryolardan pek çoğunun o kadar deliklerle dolu olduğu ortaya çıkıyor ki, fazla çaba harcamadan daha büyük bir delik açıp kabuklarını su basmayı başarıyorlar. elbette, yalnızca deneme amaçlıdır ve başka bir şey değildir (bu tür sitelerin yönetimi her zaman mevcut güvenlik açıkları konusunda bilgilendirilir).

    Doğrulamanın öneminin herkes için açık olduğunu düşünüyorum. Uzun bir süre boyunca her seferinde aynı kod parçasını yazdım, ardından çoğu çok ilkel olan ve genellikle her yere dağılmış olan kendi veri doğrulama işlevlerimi kullandım. farklı parçalar(ekli dosyalar. Kısa süre sonra, projelerim için ödünç aldığım verileri doğrulamak için her biri kendi sınıfını uygulayan Zend, CI, Kohana PHP çerçeveleriyle tanışmaya başladım. Sonunda CI sınıflarından birini ihtiyaçlarıma göre uyarlamaya karar verdim, ancak programlama bloglarından birinin yazarının bununla zaten ilgilendiği ortaya çıktı. Daha sonra çalışmalarını yani değiştirilmiş CodeIgniter kütüphanesini paylaşıyorum.

    Aşağıdaki koda bakalım:

    Kodu görüntüle PHP

    require_once "validator.class.php"; $doğrulayıcı = yeni Doğrulayıcı() ; $validator -> set_rules ("isim", "Adınız", dizi ("gerekli" =>, "alfa" => ) ) ; $validator -> set_rules ("email" , "E-posta adresiniz" , array ("gerekli" => "%s alanı gerekli" , "valid_email" => ) ) ; if ($doğrulayıcı -> çalıştır () ) ( echo "Doğrulama başarılı oldu"; ) else ( echo $doğrulayıcı -> get_string_errors () ; )

    Örnekte de görebileceğiniz gibi ilk satıra sınıf dosyasını dahil ediyoruz. validator.calss.php senaryomuza. Daha sonra sınıfın bir örneğini oluşturuyoruz ve nesneyi bir değişkene kaydediyoruz. $doğrulayıcı.
    Daha sonra yöntemi kullanarak $validator->set_rules($field, $label, $rules) doğrulama için alanları ayarlayın.

    Bu yöntem 3 parametre alır:

  • $alan- doğrulama alanının adı (etiketteki name özelliğinin değeri)
  • $etiket- doğrulama alanının adı, hata mesajlarına eklenecektir
  • $kurallar- doğrulama kuralının anahtar olarak kullanıldığı ve bu kurala ilişkin hata mesajının değer olarak kullanıldığı bir doğrulama kuralları dizisi
  • Doğrulama için tüm alanlar ayarlandıktan sonra, yöntemi kullanarak doğrulayıcıyı başlatıyoruz. $validator->run(). Doğrulama başarılı olursa bu yöntem değeri döndürür DOĞRU, aksi takdirde herhangi bir hata varsa geri döner YANLIŞ.

    Hata mesajlarını almanın üç yöntemi vardır:

  • get_string_errors()- tüm hata mesajlarını bir dize olarak döndürür
  • get_array_errors()— tüm mesajları bir dizi olarak döndürür; burada anahtar olarak alan adı kullanılır ve değer olarak bu alanın hata açıklaması kullanılır.
  • form_error($alan)- $field parametresi olarak iletilen alan için bir hata mesajı döndürür
  • Varsayılan olarak hata mesajları bir etikete sarılır . Tasarımınızı ayarlamak için yöntemi kullanın set_error_delimiters($önek, $sonek). Örneğin şöyle:

    Hata mesajları artık şu şekilde görünecektir: div sınıfla "hata"

    Gördüğünüz gibi her şey çok basit.

    Kodu görüntüle PHP

    $validator -> set_error_delimiters("","");

    Doğrulama kurallarını ayarlamak için yöntemi kullanabilirsiniz. set_rules($alanlar)çok boyutlu bir ilişkisel diziyi iletir. Bir örneğe bakalım:

    Kodu görüntüle PHP

    $rules = array ( array ( "alan" => "isim", "etiket" => "Adınız", "kurallar" => array ( "gerekli" => "%s alanı gerekli" , "alfa" = > "%s alanı yalnızca harfler içermelidir" ), array ( "field" => "e-posta" , "label" => "E-posta adresiniz" , "kurallar" => array ( "gerekli" => "% s alanı gerekli" , "valid_email" => "%s alanı geçerli bir e-posta adresi içermelidir" ) ) ) ; $doğrulayıcı -> set_rules ($kurallar) ;

    Gördüğünüz gibi, ilk örnekteki doğrulama kurallarının aynısını yalnızca çok boyutlu bir ilişkisel dizi biçiminde yazdım. Belirli bir durumda size en uygun yöntemlerden herhangi birini kullanabilirsiniz.

    Peki bu sınıf hangi doğrulama kurallarını destekliyor?

    Bu sınıfa herkesin karşılaştığı en yaygın doğrulama kurallarını getirdim. Burada tam liste bu kurallar:

    gerekliAlan boşsa FALSE değerini döndürür
    tamsayıDeğer bir tamsayı değilse FALSE değerini döndürür
    batmadan yüzmekDeğer sayısal bir değer değilse FALSE değerini döndürür
    geçerli_urlDeğer geçerli bir URL değilse FALSE değerini döndürür
    geçerli e-postaDeğer geçerli bir e-posta adresi değilse FALSE değerini döndürür
    geçerli_ipIP adresi geçerli değilse FALSE değerini döndürür
    maçlarÖğe başka bir alan öğesinin değeriyle eşleşmiyorsa FALSE değerini döndürür
    alfaÖğe yalnızca harflerden fazlasını içeriyorsa FALSE değerini döndürür
    geçerli_captchaOturum alanındaki değer form alanının değerine eşit değilse FALSE değerini döndürür
    geçerli tarihÖğe geçersiz bir tarih içeriyorsa FALSE değerini döndürür

    Bu kuralların çoğu PHP 5'te kullanıma sunulan filtreleri kullanır.

    İsterseniz Validator sınıfına gerekli fonksiyonları ekleyerek doğrulama için kurallar kümesini her zaman genişletebilirsiniz.

    İşlenen POST veri değerini almak için aşağıdaki yöntemi kullanın:

    Kodu görüntüle PHP

    Tipik olarak bu yöntem, formun başarılı bir şekilde işlenmesi üzerine formu temizlemek için çağrılır.


    Önceki bir makalede kendi kütüphanemin mevcut diğer çözümlerle bir karşılaştırmasını yazacağıma söz vermiştim, bu yüzden bugün Aura.Filter, Respect Validation, Sirius Validation ve Valitron kullanarak doğrulamaya bakacağız.


    Kullanıcıların tüm işlevlere tam erişim için kayıt olmalarını gerektiren belirli bir kamu hizmetimizin geliştirilme aşamasında olduğunu hayal edelim. Böylece kayıt formu aşağıdaki alanları içerecektir:

  • isim.
  • Birincisi kullanıcının adı ve ikincisi soyadı olmak üzere tam olarak iki kelime içermelidir.
  • e-posta. Geçerli bir e-posta adresi içermelidir.
  • e-posta. Geçerli bir adres içermelidir
  • E-posta
  • şifre.


    Ayarlanmalı ve 64 karakterden uzun olmamalıdır.

    kabul.

    Kullanıcının hizmet şartlarını kabul ettiğini onaylamak için işaretlemesi gereken tipik bir onay kutusu.

    Yani hayali hizmetimize kaydolmak için kullanıcının doldurması gereken beş alanımız var. Giriş olarak tamamen geçersiz veriler aldığımızı düşünelim:

  • $data = [ "isim" => "Albert", // İki kelime olmalı "giriş" => "@lbert", // "Yasak" karakter @ "e-posta" => "yanlış bir şey", / / ​​Olmalı bir e-posta "şifresi" olun => Aura.Filter
  • Aura.Filter kullanarak doğrulama bir filtre fabrikasıyla başlar. Bireysel bir değeri değil, bir diziyi doğrulayacağımız için "konu filtresi" adı verilen bir filtre oluşturmamız gerekiyor.
  • Aura\Filter\FilterFactory kullanarak kuralları tanımlarız; $filter = (yeni FilterFactory)->newSubjectFilter(); $filter->validate("name") ->isNotBlank() ->is("two_words") ->setMessage("Ad iki kelimeden oluşmalıdır."); $filter->validate("login") ->isBlankOr("alnum") ->setMessage("Bir kullanıcı adı belirtirseniz, yalnızca Latin karakterleri içermelidir."); $filter->validate("email") ->isNotBlank() ->is("email") ->setMessage("Lütfen geçerli bir e-posta adresi girin."); $filter->validate("password") ->isNotBlank() ->is("strlenMax", 64) ->setMessage("Lütfen şifrenizi yazınız."); $filter->validate("kabul edildi") ->is("geri arama", function($konu, $alan) ( return $konu->($alan) === true; ))->setMessage("Gerekli Hizmet şartlarını kabul ediyorum.");
  • Gördüğünüz gibi kuralların açıklaması oldukça basit. Aura.Filter, kutudan çıkmış bir dizi yararlı kural sağlar ve bunlardan bazıları yukarıdaki örnekte kullanılmıştır:
  • geri çağırmak.
  • Two_words kuralını belirtmediğimi muhtemelen fark etmişsinizdir. Aura.Filter'da doğal olarak böyle bir kural yok, o yüzden bir tane oluşturmamız gerekiyor. Belgelerde belirtildiği gibi bu, kural için ayrı bir sınıf kullanılarak yapılır:


    /** * Kullanıcı adını doğrulayan kural. * Kullanıcı adı iki kelimeden oluşur: ad ve soyadı, bir boşlukla ayrılmış. */ class KullanıcıAdıRule ( /** * Kullanıcı adını doğrular. * * @param object|array $subject * @param string $field * @param int $max * * @return bool */ public function __invoke($konu, $field) , $max = null) ( $value = $konu->($field); if (! is_scalar($value)) ( return false; ) return (bool) preg_match("/^+\s+$/u", $değer);

    İkinci adım, filtre fabrikasına yeni kuralımız hakkında bilgi vermektir. Bu, ilk argümanın bir kurallar dizisi olarak filtre fabrikasına iletilmesiyle yapılır:


    Bir sonraki adım Aura.Filter'a yeni bir kural oluşturduğumuzu ve onu kullanmak istediğimizi bildirmektir. Bu, fabrikanın ilk argümanına bir dizi kural iletilerek yapılır:


    Aura\Filter\FilterFactory'yi kullanın; $kurallar = [ "iki_kelime" => işlev() ( yeni KullanıcıAdıKuralını döndür; ) ]; $filter = (new FilterFactory($rules))->newSubjectFilter();

    Artık two_words kuralımız diğer standart kurallarla aynı şekilde kullanılabilir.

    Geri bildirim

    Hatırlayacağınız gibi doğrulama yaptığımız veriler tamamen geçersizdir, çünkü her alan yanlış değer içermektedir veya hiç içermemektedir. Bu nedenle, doğrulama sonucunda hatalar ve bunlarla ilgili mesajlar alacağımız varsayılmaktadır.


    Aura.Filter ile şu şekilde doğrulama yapıyoruz:


    $geçerli = $filtre->uygula($veri); if (! $geçerli) ( $başarısızlıklar = $filtre->getFailures(); $mesajlar = $başarısızlıklar->getMessages(); )

    İÇİNDE $mesajlar bir dizi yazılıyor, dolayısıyla mesajları görüntülemek için iç içe geçmiş iki foreach'a ihtiyacımız var:


    Doğrulamaya Saygı Göster

    Karşılaştırmada kullandığım ikinci kütüphane ise Respect Validation adı verilen nispeten popüler bir çözüm. İnsanlar ona güvendiği için orada görülecek bir şey olduğunu düşünüyorum.


    Deneyin saflığı için kütüphaneleri karşılaştırırken başlangıçta tanımlanan aynı veri setini kullanacağız:


    Respect\Validation\Validator'ı v olarak kullanın; $data = [ "isim" => "Albert", // İki kelime olmalı "giriş" => "@lbert", // "Yasak" karakter @ "e-posta" => "yanlış bir şey", / / ​​Olmalı buraya bir e-posta yazın "şifre" => "" // Şifre hiç belirtilmedi // kullanıcı kutuyu işaretlemediğinden "kabul edildi" dizide yok ]; Kuralların tanımlanması

    Aura.Filter'da olduğu gibi, kullanıcı adı için kendi doğrulama kuralımıza ihtiyacımız var, o yüzden oradan başlayalım:


    ad alanı MyNamespace; Saygı\Validation\Rules\AbstractRule'u kullanın; class UserNameRule, AbstractRule'u genişletir ( public function validate($input) ( return (bool) preg_match("/^+\s+$/u", $input); ) )

    Harici kurallar API'si Aura.Filter ile neredeyse aynıdır; __invoke() büyüsü yerine yalnızca validate() yöntemi kullanılır. Bana bu API daha basit ve daha anlaşılır geldi. Eh, Kontrolio'ya daha yakın :)


    Belgelerde bununla ilgili herhangi bir söz bulamadım, ancak kuralın kendisine ek olarak bunun için kendi istisna türünüzü oluşturmanız gerekir. İstisna sınıfının adı, kural sınıfının adından ve bir son ekten oluşmalıdır İstisna.


    Respect\Validation\Exceptions\NestedValidationException'ı kullanın; UserNameRuleException sınıfı NestedValidationException'ı genişletir ( // )

    Sonunda verilerimizi doğrulayabiliriz. Öncelikle yeni kuralımızı doğrulayıcıya iletiyoruz ki onun da bundan haberdar olması ve gelecekte kullanabilmemiz için. Saygı Doğrulamasında bu, standart olmayan kuralların bulunduğu ad alanını ileterek with() yöntemi çağrılarak yapılır.


    v::with("MyNamespace\\");

    Artık standart olmayan tüm kurallar ad alanında yer alıyor MyNamespace, doğrulayıcı tarafından "tanınacaktır". Bir sonraki adım gerekli kuralları tanımlamak ve doğrulamayı gerçekleştirmektir.


    v::attribute("name", v::userNameRule()) ->attribute("login", v::alnum("-_")) ->attribute("email", v::email()) ->attribute("password", v::notEmpty()->stringType()->length(null, 64)) ->attribute("kabul edildi", v::trueVal()) ->assert((object) $veri);

    Kuralımızı özelliğe nasıl uyguladığımıza dikkat edin isim. Burada kural sınıfının adı, doğrulayıcı yöntemin adına dönüştürülmüştür. Geri kalan kurallar genel olarak sezgiseldir.


    Diziyi neden sağladığımızı ayrıca belirtmekte fayda var $veri nesneye. Gerçek şu ki, Saygı Doğrulaması girdi olarak dizileri değil nesneleri kabul eder. Bu kütüphaneyi kullanarak geliştirme yaparken bu dikkate alınmalıdır.

    Geri bildirim

    Aura.Filter'ın aksine Respect doğrulayıcı, doğrulama başarısız olduğunda bir istisna atar. Ve bu istisna, doğrulama hata mesajlarını içerir. Bu nedenle, az önce gösterilen örneğin şu şekilde yazılması gerekir:


    try ( v::with("RespectValidationExample\\"); v::attribute("name", v::userNameRule()) ->attribute("login", v::alnum("-_")) - >attribute("email", v::email()) ->attribute("password", v::notEmpty()->stringType()->length(null, 64)) ->attribute("kabul edildi", v::trueVal()) ->assert((object) $data ) catch (NestedValidationException $ex) ( $messages = $ex->getMessages(); )

    getMessages()'ı kullanarak, doğrulayıcının doğrulama işlemi sırasında topladığı tüm mesajların düz bir dizisini elde edeceğiz. Diziyi boşalttığımızda şöyle bir şey elde ederiz:


    array(5) ( => string(29) “%s için veri doğrulaması başarısız oldu” => string(60) “giriş yalnızca harfler (a-z), rakamlar (0–9) ve “-_” içermelidir” => string (25) “e-posta geçerli bir e-posta olmalıdır” => string(26) “şifre boş olmamalıdır” => string(32) “Kabul edilen özellik mevcut olmalıdır” )

    Mesajları kendinize göre değiştirebilirsiniz. Belki bu kitaplığı bir şekilde yanlış anladım, ancak bu süreç bana o kadar açık gelmedi: iletileri nitelikler için değil kurallar için tanımladığınız, işlenmiş bir istisna üzerinde findMessages() yöntemini kullanmanız gerekir.


    $ex->findMessages([ "userNameRule" => "Kullanıcı adı iki kelimeden oluşmalıdır.", "alnum" => "Giriş bilgilerinizi beğenmiyoruz.", "email" => "Belli ki sevmiyorsunuz bize e-posta adresinizi vermek istiyorsunuz.", "notEmpty" => "Peki, şifreniz nerede?", "agred" => "Kabul etmemeniz çok yazık." ]);

    Sorunun ne olduğunu bilmiyorum ama hala anlamadığım birkaç şey var. Kuralları yukarıdaki şekilde tanımlayarak elde ettiğimiz şey budur:


    array(5) ( => string(40) “Kullanıcı adı iki kelimeden oluşmalıdır.” => string(31) “Giriş bilgilerinizi beğenmiyoruz.” => string(25) “e-posta geçerli bir e-posta olmalıdır” = > string(5) "Peki, şifreniz nerede?" => string(9) "Kabul etmemeniz çok yazık."

    Gördüğünüz gibi e-posta alanına yönelik mesaj uygulanmadı, standart olan kaldı. Ancak indeks 4'teki mesaj tam tersi! Ve bu, kuralın adını değil alanın adını kullanmama rağmen. Oysa kural adını (trueVal) kullansaydım mesajım bir yerlerde kaybolurdu. Bu kütüphanenin deneyimli kullanıcılarının yorumları memnuniyetle karşılanacaktır.

    Sirius Doğrulaması

    Tamam, bir sonraki kütüphaneye geçelim ve onun benzer görevleri nasıl yerine getirdiğini görelim.

    Kuralların tanımlanması

    Kullanıcı adı için bir kez daha kural tanımlamamız gerekiyor. Buna şöyle bir şey yazacağız:


    class UserNameRule extends AbstractRule ( // Hata Mesajları const MESSAGE = "Kullanıcı adı iki kelimeden oluşmalıdır."; const LABELED_MESSAGE = "(etiket) iki kelimeden oluşmalıdır."; public function validate($değer, $değerIdentifier = null ) ( return (bool) preg_match("/^+\s+$/u", $değer) ) )

    Lütfen daha önce tartışılan kütüphanelerle karşılaştırıldığında yaklaşımlardaki farklılığa dikkat edin. Özellikleri, yöntemleri veya kural argümanlarını kullanmak yerine iki tür mesajı sabitlerde tanımlarız.


    Şimdi doğrulama mantığını anlatalım:


    $doğrulayıcı = yeni Doğrulayıcı; $validator ->add("name", "required | MyApp\Validation\Rule\UserNameRule") ->add("login", "required | alphanumhyphen", null, "Giriş yalnızca Latin harfleri, tireler ve alt çizgileri içerebilir. ") ->add("e-posta", "gerekli | e-posta", null, "Lütfen doğru bir e-posta girin.") ->add("şifre", "gerekli | maksimum uzunluk(64)", null, "Sizin şifreniz efendim.") ->add("katılıyorum", "gerekli | eşittir(doğru)", null, "Neden kabul etmediniz?");

    Gördüğünüz gibi kurallar seti çok basit ve okunabilir. Açıklama için yatay çubuklarla ayrılmış adlar kullanırız. Bu yaklaşım Laravel ve Kontrolio'da kullanılana benzer.


    add() yönteminin dördüncü argümanı, doğrulama başarısız olursa Sirius'un kullanacağı doğrulama hata mesajını açıklar. Yeni kuralımız için neden bir mesaj eklemedik? KullanıcıAdıKural?


    $validator->add("isim", "gerekli | Uygulamam\Doğrulama\Kural\KullanıcıAdıRule")

    Bunun nedeni mesajların zaten sınıf sabitlerinde tanımlanmış olmasıdır:


    class UserNameRule extends AbstractRule ( // Hata mesajları const MESSAGE = "Kullanıcı adı iki kelimeden oluşmalıdır."; ...

    Başka bir seçenek de doğrulayıcının addMessage() yöntemini kullanmaktır:


    $validator->addMessage("email", "Lütfen geçerli bir e-posta girin.");

    Özel kuralların sınıflarının tam adıyla tanımlandığını, Kontrolio'da ise bir takma ad/takma ad belirtebileceğinizi lütfen unutmayın.

    Geri bildirim

    Doğrulamayı gerçekleştirmek için, ona veri aktararak doğrulama yöntemini validate() çağırırız:


    $data = [ "isim" => "Albert", // İki kelime olmalı "giriş" => "@lbert", // "Yasak" karakter @ "e-posta" => "yanlış bir şey", / / ​​Olmalı buraya bir e-posta yazın "şifre" => "" // Şifre hiç belirtilmedi // kullanıcı kutuyu işaretlemediğinden "kabul edildi" dizide yok ]; $validator->validate($veri);

    Respect'in aksine, Sirius bir istisna atmayacak, sadece geri dönecektir YANLIŞ. Doğrulama hata mesajları getMessages() doğrulama yöntemi aracılığıyla elde edilebilir. Hataları özniteliklere göre gruplandırılmış olarak döndürür, bu nedenle hataların üzerinden geçmek için iki foreach döngüsüne ihtiyacımız var:


    foreach ($validator->getMessages() as $attribute => $messages) ( foreach ($messages as $message) ( echo $message->getTemplate() . "\n"; ) )

    Burada $message bir sınıf nesnesidir Sirius\Doğrulama\HataMesajıİhtiyacımız olan mesajı döndüren getTemplate() yöntemine sahip.

    ValitronKuralların tanımlanması

    İlk fark: Yeni bir kural eklemek için ayrı bir sınıf oluşturmanıza gerek yoktur. Boole sonucunu döndüren bir kapatma kullanabilirsiniz.


    Özel kurallar eklemek için Valitron'un, ilk iki argümanın gerekli olduğu ve üçüncüsünün isteğe bağlı olduğu statik bir addRule() yöntemi vardır. Kural tanımlayıcıyı, mantığı ve hata mesajını tek bir yerde gösterdiği için bu yöntemi beğendim.


    Valitron\Validator'ı kullanın; Validator::addRule("two_words", function($field, $value) ( ​​​return (bool) preg_match("/^+\s+$/u", $value); ), "Kullanıcı adı tam olarak aşağıdakilerden oluşmalıdır: iki kelime ");

    İkinci fark, kuralların niteliklere nasıl uygulandığıdır. Önceki tüm durumlarda, bir niteliğin adeta birincil bir şey olduğunu gördük.


    Valitron farklı bir yol izledi ve doğrulama kurallarını ilk sıraya koydu. Kuralları tanımlayarak, bu kurallara nitelikler uyguluyormuş gibi görünüyorsunuz; bunun tersi geçerli değil.


    $doğrulayıcı = new Doğrulayıcı($veri); $validator ->rule("iki_kelime", "isim")->etiket("") ->kural("gerekli", [ "isim", "giriş", "e-posta", "şifre", "kabul edildi" ] ) ->kural("bilgi", "giriş") ->kural("e-posta", "e-posta") ->kural("kabul edildi", "kabul edildi");

    Örnekte görüldüğü gibi rule() yönteminde önce kuralın adını yazıyoruz ve ancak daha sonra bu kurala karşılık gelmesi gereken nitelikleri belirtiyoruz. Daha açık bir örnek, niteliklerin bu kurala nasıl "ait" olduğunu gösteren zorunlu kuraldır.


    Valitron (incelediğimiz diğer çözümler gibi) standart hata mesajları sağlar. Bunları yalnızca kullanırsanız, her mesajın ilgili özelliğin adıyla başladığını göreceksiniz.


    Valitron, standart dışı hata mesajları kullanıldığında bile mesaj metninde nitelik adlarını değiştirir. Bu nedenle nitelik adını kaldırmak için boş bir dizeyle label() yöntemini kullandık.


    $validator->rule("two_words", "name")->label("")

    Özellikle doğrulamayla ilgili olarak Valitron kütüphane API'si, makalede daha önce gördüklerimizden neredeyse hiç farklı değildir. Doğrulamayı gerçekleştirmek için doğrulama yöntemini validate() olarak adlandırırız:


    $doğrulayıcı->doğrula();

    Doğrulama hata mesajları getErrors() yöntemi kullanılarak alınabilir:


    $doğrulayıcı->hatalar();

    Buradaki mesajlar, mesaj için ayrı bir sınıf olmaması ve düzenli, çok boyutlu bir dizi elde etmemiz dışında, Sirius Doğrulama'dakiyle aynı şekilde niteliklere göre gruplandırılır.


    foreach ($validator->errors() as $attribute => $messages) ( foreach ($messages as $message) ( echo $message . "\n"; ) ) Kontrolio

    Ve son olarak bugünün son kütüphanesi Kontrolio adlı kendi geliştirmemdir.

    Kuralların tanımlanması

    Yine beşinci kez kullanıcı adı için doğrulama kuralı oluşturacağız. Her şey nispeten basit ve standarttır:


    ad alanı MyProject\Validation\Rules; Kontrolio\Rules\AbstractRule'u kullanın; class TwoWords extends Kontrolio\Rules\AbstractRule ( public function isValid($input = null) ( return (bool) preg_match("/^+\s+$/u", $input); ) )

    Şimdi bir fabrika yaratıyoruz ve extend() yöntemini kullanarak içine bir kural kaydediyoruz:


    ad alanı MyProject; Kontrolio\Factory'yi kullanın; MyProject\Validation\Rules\TwoWords'u kullanın; $factory = Kontrolio\Factory::getInstance()->extend();

    Kuralı kaydettikten sonra, isme göre - iki_kelime dahil olmak üzere onu kullanabiliriz. Bir doğrulayıcı oluşturalım:


    $data = [ "isim" => "Albert", // İki kelime olmalı "giriş" => "@lbert", // "Yasak" karakter @ "e-posta" => "yanlış bir şey", / / ​​Olmalı buraya bir e-posta yazın "şifre" => "" // Şifre hiç belirtilmedi // kullanıcı kutuyu işaretlemediğinden "kabul edildi" dizide yok ]; $rules = [ "isim" => "iki_kelime", "giriş" => "bazen|alphadash", "email" => "e-posta", "şifre" => "uzunluk:1,64", "kabul edildi" = > " kabul edilmiş" ]; $messages = [ "name" => "Kullanıcı adı iki kelimeden oluşmalıdır.", "login" => "Giriş bilgilerinizi beğenmiyoruz.", "email" => "Belli ki vermek istemiyorsunuz bize e-posta adresinizi .", "password" => "Peki, şifreniz nerede?", "kabul ediyorum" => "Kabul etmemeniz çok yazık." ]; $doğrulayıcı = $fabrika->make($veri, $kurallar, $mesajlar);

    Kuralları Laravel'de kullanılana benzer bir sözdizimi kullanarak tanımladık, ancak daha ayrıntılı bir versiyon da kullanabilirdik:


    $rules = [ "isim" => new TwoWords, "giriş" => , "email" => yeni E-posta, "şifre" => new Uzunluk(1, 64), "kabul edildi" => yeni Kabul edildi ]; Geri bildirim

    Doğrulama aynı validate() yöntemi kullanılarak başlatılır:


    $doğrulayıcı->doğrula();

    Artık getErrors() veya getErrorsList() yöntemlerinden birini kullanarak hata mesajları alabiliriz. İlk yöntem daha karmaşık hata çıktısına izin verirken ikincisi düz bir dizi döndürür. getErrors() işlevini kullanarak şuna benzer mesajların çıktısını alabiliriz:



    getErrorsList() ile daha basit bir mesaj listesi oluşturabilirsiniz:


    Sonuç olarak

    Bu makalede aşağıdaki kütüphanelerin kullanımına ilişkin örnekler gösterdim:

  • Aura.Filtre
  • Doğrulamaya Saygı Göster
  • Sirius Doğrulaması
  • Valitron
  • kontrol
  • "Gerçek dünyadan bir örnek" çok basit görünebilir. Buna katılıyorum çünkü gerçekten de bazı kütüphane özellikleri makalenin dışında bırakıldı. Prensip olarak, eğer ilgileniyorsanız, özelliklerini kendiniz inceleyebilirsiniz.


    Her kütüphanenin kendine has özellikleri ve karanlık tarafları var, bu yüzden birini seçmenin zevk ve zorluk meselesi olduğunu düşünüyorum.


    Okuduğunuz için teşekkürler. Doğru seçimi yap.

    Bu kural türü Kontrolio'daki kapatmalara benzer. Kapanış şeklinde bir kural tanımlamanıza olanak tanır. Bu kapanışa, Aura.Filter "konu"yu, formdaki veri dizimizi ve bu durumda kabul edilen bir alanı aktarır.

    • Etiketler:
    • veri doğrulama
    • php
    bisiklet binası