Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

Vërtetim i çmendur php. Validimi dhe pastrimi i të dhënave duke përdorur PHP


Në një artikull të mëparshëm premtova të shkruaj një krahasim të bibliotekës sime me zgjidhje të tjera të disponueshme, kështu që sot do të shikojmë vërtetimin duke përdorur Aura.Filter, Respect Validation, Sirius Validation dhe Valitron.


Le të imagjinojmë se kemi një shërbim të caktuar publik në zhvillim që kërkon që përdoruesit të regjistrohen për akses të plotë në të gjitha funksionet. Kështu, formulari i regjistrimit do të përmbajë fushat e mëposhtme:

  • emri. Duhet të përmbajë saktësisht dy fjalë, ku e para është emri i përdoruesit dhe e dyta është mbiemri.
  • identifikimi. Nëse kalohet një vlerë, ajo duhet të përmbajë vetëm shkronja latine, viza dhe vija nënvizuese.
  • email. Duhet të përmbajë një adresë të vlefshme emaili.
  • fjalëkalimin. Duhet të vendoset dhe të jetë jo më shumë se 64 karaktere.
  • ra dakord. Një kuti tipike e kontrollit që një përdorues duhet të kontrollojë për të konfirmuar pranimin e kushteve të shërbimit.
  • Pra, ne kemi pesë fusha që përdoruesi duhet të plotësojë për t'u regjistruar në shërbimin tonë imagjinar. Le të imagjinojmë se kemi marrë të dhëna plotësisht të pavlefshme si hyrje:


    $data = [ "name" => "Albert", // Duhet të jenë dy fjalë "login" => "@lbert", // karakteri "i ndaluar" @ "email" => "diçka nuk shkon", / / ​​Duhet të ketë të jetë një e-mail "password" => Aura.Filter

    Vërtetimi duke përdorur Aura.Filter fillon me një fabrikë filtri. Ne duhet të krijojmë një të ashtuquajtur "filtër subjekti", pasi do të vërtetojmë një grup, jo një vlerë individuale.

    Ne përcaktojmë rregullat duke përdorur Aura\Filter\FilterFactory; $filter = (Fabrika e Filterit të ri)->NewSubjectFilter(); $filter->validate("name") ->isNotBlank() ->is("dy_words") ->setMessage("Emri duhet të jetë dy fjalë."); $filter->validate("login") ->isBlankOr("alnum") ->setMessage("Nëse specifikoni një hyrje, ai duhet të përmbajë vetëm karaktere latine."); $filter->validate("email") ->isNotBlank() ->is("email") ->setMessage("Ju lutemi shkruani një adresë të vlefshme emaili."); $filter->validate("password") ->isNotBlank() ->is("strlenMax", 64) ->setMessage("Ju lutemi shkruani fjalëkalimin tuaj."); $filter->validate("dakord") ->është ("kthimi i thirrjes", funksioni($subject, $field) (kthimi $subject->($field) === true; ))->setMessage("Ju duhet dakord me kushtet e shërbimit.");

    Siç mund ta shihni, përshkrimi i rregullave është mjaft i thjeshtë. Aura.Filter ofron një sërë rregullash të dobishme jashtë kutisë dhe disa prej tyre janë përdorur në shembullin e mësipërm:

  • metoda nuk është e zbrazët. Përcakton që fusha nuk mund të ketë vlerë null.
  • i shkolluar. Ky rregull lejon vetëm shkronja latine.
  • email. Dhe është kaq e qartë :)
  • strlenMax. Përcakton që fusha nuk mund të kalojë gjatësinë e specifikuar nga argumenti i dytë i metodës is.
  • kthimi i thirrjes. Ky lloj rregulli është i ngjashëm me mbylljet nga Kontrolio. Kjo ju lejon të përcaktoni një rregull në formën e një mbylljeje. Për këtë mbyllje, Aura.Filter kalon "subjektin", grupin tonë të të dhënave nga formulari dhe një fushë, në këtë rast dakord.
  • Ju ndoshta keni vënë re se unë nuk e specifikova rregullin two_words. Natyrisht, nuk ka një rregull të tillë në Aura.Filter, kështu që ne duhet të krijojmë një të tillë. Siç thotë dokumentacioni, kjo bëhet duke përdorur një klasë të veçantë për rregullin:


    /** * Rregulla që vërteton emrin e përdoruesit. * Emri i përdoruesit përbëhet nga dy fjalë: emri dhe mbiemri, të ndara me një hapësirë. */ class UserNameRule ( /** * Vlerëson emrin e përdoruesit. * * @param objekt|array $subject * @param string $field * @param int $max * * @return bool */ funksioni publik __invoke($subject, $field , $max = null) ( $value = $subject->($field); if (! is_scalar($value)) ( return false; ) return (bool) preg_match("/^+\s+$/u", $value); ))

    Hapi i dytë është të njoftojmë fabrikën e filtrave për rregullin tonë të ri. Bëhet duke kaluar argumentin e parë si një grup rregullash në fabrikën e filtrave:


    Hapi tjetër është të njoftojmë Aura.Filter se kemi krijuar një rregull të ri dhe duam ta përdorim atë. Kjo bëhet duke kaluar një sërë rregullash në argumentin e parë të fabrikës:


    përdorni Aura\Filter\FilterFactory; $rules = [ "dy_fjalë" => funksion() ( ktheni UserNameRule të ri; ) ]; $filter = (New FilterFactory($rregullat))->newSubjectFilter();

    Tani rregulli ynë dy_fjalë mund të përdoret në të njëjtën mënyrë si çdo rregull tjetër standard.

    Feedback

    Siç e mbani mend, të dhënat hyrëse që vërtetojmë janë plotësisht të pavlefshme, sepse çdo fushë përmban një vlerë të pasaktë ose nuk e përmban fare atë. Prandaj, supozohet se si rezultat i vlefshmërisë do të marrim gabime dhe mesazhe përkatëse rreth tyre.


    Ne vërtetojmë me Aura.Filter si më poshtë:


    $valid = $filter->aplikoni($data); nëse (! $vlefshëm) ( $failures = $filter->getFailures(); $messages = $failures->getMessages(); )

    $mesazhe një grup është duke u shkruar, kështu që për të shfaqur mesazhet na duhen dy foreach të mbivendosur:


    Respekte Vleresimin

    Biblioteka e dytë që përdora në krahasim është një zgjidhje relativisht e njohur e quajtur Respect Validation. Meqenëse njerëzit i besojnë asaj, mendoj se ka diçka për të parë atje.


    Për pastërtinë e eksperimentit, kur krahasojmë bibliotekat, do të përdorim të njëjtin grup të dhënash të përcaktuar në fillim:


    përdorni Respect\Validation\Validator si v; $data = [ "name" => "Albert", // Duhet të jenë dy fjalë "login" => "@lbert", // karakteri "i ndaluar" @ "email" => "diçka nuk shkon", / / ​​Duhet të ketë të jetë një e-mail këtu "password" => "" // Fjalëkalimi nuk është specifikuar fare // "dakord" nuk është në grup sepse përdoruesi nuk e ka kontrolluar kutinë ]; Përcaktimi i rregullave

    Ashtu si me Aura.Filter, na duhet rregulli ynë i vlefshmërisë për emrin e përdoruesit, kështu që le të fillojmë këtu:


    hapësira e emrave MyNamespace; përdorni Respect\Validation\Rules\AbstractRule; Klasa UserNameRule zgjeron AbstractRule ( funksioni publik validate($input) ( return (bool) preg_match("/^+\s+$/u", $input); ) )

    API e rregullave të jashtme është pothuajse identike me Aura.Filter, vetëm metoda validate() përdoret në vend të magjisë __invoke(). Më dukej, kjo API, më e thjeshtë dhe më e kuptueshme. Epo, është më afër Kontrolio :)


    Unë nuk gjeta ndonjë përmendje të kësaj në dokumentacion, megjithatë, përveç vetë rregullit, duhet të krijoni llojin tuaj të përjashtimit për të. Emri i klasës së përjashtimit duhet të përbëhet nga emri i klasës së rregullave dhe një postfiks Përjashtim.


    përdorni Respect\Validation\Exceptions\NestedValidationException; Klasa UserNameRuleException zgjeron NestedValidationException ( // )

    Epo, më në fund ne mund të vërtetojmë të dhënat tona. Së pari, ne ia kalojmë rregullin tonë të ri verifikuesit në mënyrë që ai të dijë për të dhe ne ta përdorim atë në të ardhmen. Në Respect Validation, kjo bëhet duke thirrur metodën with(), duke kaluar hapësirën e emrave në të cilën ndodhen rregullat jo standarde.


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

    Tani të gjitha rregullat jo standarde të vendosura në hapësirën e emrave Hapësira e emrit tim, do të “njihet” nga verifikuesi. Hapi tjetër është të përshkruani rregullat e nevojshme dhe të kryeni vërtetimin.


    v::attribute("emri", v::userNameRule()) ->atribut("login", v::alnum("-_")) ->atribut("email", v::email()) ->attribute("password", v::notEmpty()->stringType()->length(null, 64)) ->atribut("pajtuar", v::trueVal()) ->pohoj((objekt) $data);

    Vini re se si e zbatojmë rregullin tonë për atributin emri. Këtu emri i klasës së rregullave është shndërruar në emër të metodës validator. Rregullat e mbetura janë, në përgjithësi, intuitive.


    Vlen të përmendet veçmas pse e ofrojmë grupin $të dhëna tek objekti. Fakti është se Respect Validation pranon objekte, jo vargje, si hyrje. Kjo duhet të merret parasysh kur zhvillohet duke përdorur këtë bibliotekë.

    Feedback

    Ndryshe nga Aura.Filter, validatori Respect bën një përjashtim kur vërtetimi dështon. Dhe ky përjashtim përmban mesazhe gabimi të vërtetimit. Prandaj, shembulli që sapo u tregua duhet të shkruhet si më poshtë:


    provo ( v::with("RespectValidationExample\\"); v::attribute("name", v::userNameRule()) ->atribut("login", v::alnum("-_")) - >attribute("email", v::email()) ->atribut("password", v::notEmpty()->stringType()->length(null, 64)) ->atribut("dakord", v::trueVal()) -> pohoj((objekt) $data); ) kap (NestedValidationException $ex) ( $messages = $ex->getMessages(); )

    Duke përdorur getMessages() do të marrim një grup të sheshtë të të gjitha mesazheve që vleftësuesi ka mbledhur gjatë procesit të vlefshmërisë. Duke hedhur grupin, marrim diçka të tillë:


    array(5) ( => string (29) "Vlerifikimi i të dhënave dështoi për %s" => string (60) "hyrja duhet të përmbajë vetëm shkronja (a-z), shifra (0-9) dhe "-_"" => varg (25) "email-i duhet të jetë email i vlefshëm" => varg (26) "fjalëkalimi nuk duhet të jetë bosh" => vargu (32) "Atributi i rënë dakord duhet të jetë i pranishëm")

    Ju mund t'i ndryshoni mesazhet tuajat. Ndoshta disi e kam keqkuptuar këtë bibliotekë, por ky proces nuk më dukej aq i dukshëm: duhet të përdorni metodën findMessages() në një përjashtim të trajtuar, në të cilin ju përcaktoni mesazhet jo për atribute, por për rregulla.


    $ex->findMessages([ "userNameRule" => "Emri i përdoruesit duhet të përbëhet nga dy fjalë.", "alnum" => "Nuk na pëlqen identifikimi juaj.", "email" => "Natyrisht që nuk e pëlqeni doni të na jepni e-mailin tuaj.", "notEmpty" => "Epo, ku është fjalëkalimi juaj?", "agreed" => "Është për të ardhur keq që nuk jeni dakord." ]);

    Nuk e di se çfarë nuk shkon, por ka disa gjëra që ende nuk i kuptoj. Kjo është ajo që ne marrim duke përcaktuar rregullat në mënyrën e mësipërme:


    array (5) ( => string (40) "Emri i përdoruesit duhet të jetë dy fjalë." => string (31) "Ne nuk na pëlqen identifikimi juaj." => string (25) "email duhet të jetë email i vlefshëm" = > string (5) "Epo, ku është fjalëkalimi juaj?" => string (9) "Është për të ardhur keq që nuk jeni dakord.")

    Siç mund ta shihni, mesazhi për fushën e emailit nuk u zbatua, ai standard mbeti. Por mesazhi në indeksin 4 është i kundërt! Dhe kjo pavarësisht se nuk kam përdorur emrin e rregullit, por emrin e fushës. Ndërsa nëse do të kisha përdorur emrin e rregullit (trueVal), mesazhi im do të kishte humbur diku. Komentet e përdoruesve me përvojë të kësaj biblioteke janë shumë të mirëseardhura.

    Vleresimi i Siriusit

    Ok, le të kalojmë te biblioteka tjetër dhe të shohim se si ajo trajton detyra të ngjashme.

    Përcaktimi i rregullave

    Edhe një herë ne duhet të përcaktojmë një rregull për emrin e përdoruesit. Do ta shkruajmë diçka si kjo:


    class UserNameRule extends AbstractRule ( // Mesazhet e gabimit const MESSAGE = "Emri i përdoruesit duhet të jetë dy fjalë."; const LABELED_MESSAGE = "(etiketa) duhet të jetë dy fjalë."; funksioni publik validate($value, $valueIdentifier = null ) ( kthim (bool) preg_match ("/^+\s+$/u", $value); ) )

    Ju lutemi vini re ndryshimin në qasje në krahasim me bibliotekat e diskutuara tashmë. Ne përcaktojmë dy lloje mesazhesh në konstante në vend që të përdorim vetitë, metodat ose argumentet e rregullave.


    Tani le të përshkruajmë logjikën e vlefshmërisë:


    $validator = Validator i ri; $validator ->add("name", "required | MyApp\Validation\Rule\UserNameRule") ->add("login", "required | alphanumhyphen", null, "Identifikohu mund të përmbajë vetëm shkronja latine, viza dhe nënvizime. ") ->add("email", "required | email", null, "Ju lutemi shkruani një e-mail të saktë.") ->add("password", "required | maxlength(64)", null, "Your fjalëkalim, zotëri.") ->add("pajtohem", "kërkohet | barabartë(e vërtetë)", null, "Pse nuk ra dakord?");

    Siç mund ta shihni, grupi i rregullave është shumë i thjeshtë dhe i lexueshëm. Për përshkrim, ne përdorim emra të ndarë me shirita horizontale. Kjo qasje është e ngjashme me atë të përdorur në Laravel dhe Kontrolio.


    Argumenti i katërt i metodës add() përshkruan mesazhin e gabimit të vlefshmërisë që Sirius do të përdorë nëse vërtetimi dështon. Pse nuk shtuam një mesazh për rregullin tonë të ri? Emri i përdoruesitRule?


    $validator->add("name", "kërkohet | MyApp\Validation\Rule\UserNameRule")

    Kjo është për shkak se mesazhet janë përshkruar tashmë në konstantet e klasës:


    klasa UserNameRule zgjeron AbstractRule ( // Mesazhet e gabimit const MESSAGE = "Emri i përdoruesit duhet të jetë dy fjalë."; ...

    Një tjetër mundësi është të përdorni metodën addMessage() të vetë validatorit:


    $validator->addMessage("email", "Ju lutemi shkruani një e-mail të vlefshëm.");

    Ju lutemi vini re se rregullat e personalizuara identifikohen me emrin e plotë të klasës së tyre, ndërsa në Kontrolio mund të specifikoni një pseudonim/alias.

    Feedback

    Për të kryer verifikimin, ne e quajmë metodën e validatorit validate(), duke ia kaluar të dhënat:


    $data = [ "name" => "Albert", // Duhet të jenë dy fjalë "login" => "@lbert", // karakteri "i ndaluar" @ "email" => "diçka nuk shkon", / / ​​Duhet të ketë të jetë një e-mail këtu "password" => "" // Fjalëkalimi nuk është specifikuar fare // "dakord" nuk është në grup sepse përdoruesi nuk e ka kontrolluar kutinë ]; $validator->validate($data);

    Ndryshe nga Respekti, Sirius nuk do të bëjë përjashtim, por thjesht do të kthehet i rremë. Mesazhet e gabimit të verifikimit mund të merren përmes metodës validator getMessages(). Ai kthen gabime të grupuara sipas atributeve, kështu që na duhen dy sythe për të kaluar nëpër gabimet:


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

    Këtu $message është një objekt i klasës Sirius\Validation\Mesage error, e cila ka një metodë getTemplate() që kthen vetë mesazhin që na nevojitet.

    ValitronPërcaktimi i rregullave

    Dallimi i parë: për të shtuar një rregull të ri, nuk keni nevojë të krijoni një klasë të veçantë. Ju thjesht mund të përdorni një mbyllje që kthen një rezultat boolean.


    Për të shtuar rregulla të personalizuara, Valitron ka një metodë statike addRule(), në të cilën kërkohen dy argumentet e para dhe i treti është opsional. Më pëlqeu kjo metodë, pasi tregon identifikuesin e rregullit, logjikën dhe mesazhin e gabimit në një vend.


    përdorni Valitron\Validator; Validator::addRule("dy_fjalë", funksion ($field, $value) (kthim (bool) preg_match("/^+\s+$/u", $value); ), "Emri i përdoruesit duhet të përbëhet saktësisht nga dy fjalë ");

    Dallimi i dytë është se si zbatohen rregullat për atributet. Në të gjitha rastet e mëparshme, pamë se një atribut është, si të thuash, një gjë parësore.


    Valitron mori një rrugë tjetër dhe vendosi rregullat e vlefshmërisë së pari. Duke përshkruar rregullat, ju duket se po aplikoni atribute për këto rregulla, dhe jo anasjelltas.


    $validator = Validator i ri($data); $validator ->rule("dy_words", "name")->label("") ->rule("required", [ "emri", "login", "email", "fjalëkalimi", "dakord" ] ) ->rule("slug", "login") ->rule("email", "email") ->rule("pranuar", "pranuar");

    Siç mund të shihet nga shembulli, në metodën rule() fillimisht shkruajmë emrin e rregullit dhe vetëm atëherë tregojmë atributet që duhet t'i korrespondojnë këtij rregulli. Një shembull më i qartë është rregulli i kërkuar, i cili tregon se si atributet "i përkasin" atij rregulli.


    Valitron (si zgjidhjet e tjera që kemi shqyrtuar) ofron mesazhe standarde të gabimit. Nëse thjesht i përdorni ato, do të shihni se çdo mesazh fillon me emrin e atributit përkatës.


    Valitron zëvendëson emrat e atributeve në tekstin e mesazhit edhe kur përdoren mesazhe gabimi jo standarde. Kjo është arsyeja pse ne përdorëm metodën label() me një varg bosh për të hequr emrin e atributit.


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

    Në mënyrë të veçantë për sa i përket vlefshmërisë, API-ja e bibliotekës Valitron praktikisht nuk ndryshon nga ajo që kemi parë tashmë në artikull. Për të kryer vërtetimin, ne e quajmë metodën e validatorit validate():


    $validator->validate();

    Mesazhet e gabimit të verifikimit mund të merren duke përdorur metodën getErrors():


    $validator->gabime();

    Mesazhet këtu grupohen sipas atributeve në të njëjtën mënyrë si në Sirius Validation, përveç se nuk ka klasë të veçantë për mesazhin dhe marrim një grup të rregullt shumëdimensional.


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

    Dhe së fundi, biblioteka e fundit për sot është zhvillimi im i quajtur Kontrolio.

    Përcaktimi i rregullave

    Përsëri, për herë të pestë, ne do të krijojmë një rregull vërtetimi për emrin e përdoruesit. Gjithçka është relativisht e thjeshtë dhe standarde:


    hapësira e emrave MyProject\Validation\Rules; përdorni Kontrolio\Rules\AbstractRule; klasa TwoWords zgjeron Kontrolio\Rules\AbstractRule (funksioni publik ështëValid($input = null) (kthim (bool) preg_match("/^+\s+$/u", $input); ) )

    Tani krijojmë një fabrikë dhe regjistrojmë një rregull në të duke përdorur metodën extension():


    hapësira e emrit MyProject; përdorni Kontrolio\Factory; përdorni MyProject\Validation\Rules\TwoWords; $factory = Kontrolio\Factory::getInstance()->extend();

    Pas regjistrimit të rregullit, ne mund ta përdorim atë, duke përfshirë emrin - two_words. Le të krijojmë një vërtetues:


    $data = [ "name" => "Albert", // Duhet të jenë dy fjalë "login" => "@lbert", // karakteri "i ndaluar" @ "email" => "diçka nuk shkon", / / ​​Duhet të ketë të jetë një e-mail këtu "password" => "" // Fjalëkalimi nuk është specifikuar fare // "dakord" nuk është në grup sepse përdoruesi nuk e ka kontrolluar kutinë ]; $rules = [ "name" => "dy_words", "login" => "ndonjëherë|alfadash", "email" => "email", "password" => "length:1.64", "agreed" = > " pranuar"]; $messages = [ "name" => "Emri i përdoruesit duhet të përbëhet nga dy fjalë.", "login" => "Nuk na pëlqen identifikimi juaj.", "email" => "Ti padyshim që nuk dëshiron të japësh na email-in tuaj .", "password" => "Epo, ku është fjalëkalimi juaj?", "agreed" => "Është keq që nuk jeni dakord." ]; $validator = $factory->make($data, $rules, $messages);

    Ne i përshkruam rregullat duke përdorur një sintaksë të ngjashme me atë të përdorur në Laravel, megjithëse mund të kishim përdorur një version më të përpiktë:


    $rules = [ "name" => New TwoWords, "login" => , "email" => Email i ri, "fjalëkalim" => New Length(1, 64), "agreed" => new Pranuar ]; Feedback

    Validimi fillon duke përdorur të njëjtën metodë validate():


    $validator->validate();

    Tani mund të marrim mesazhe gabimi duke përdorur një nga metodat getErrors() ose getErrorsList(). Metoda e parë lejon dalje më komplekse të gabimeve, ndërsa e dyta kthen një grup të sheshtë. Duke përdorur getErrors() ne mund të nxjerrim mesazhe diçka si kjo:



    Dhe me getErrorsList() mund të bëni një listë më të thjeshtë mesazhesh:


    Fundi

    Në këtë artikull kam treguar shembuj të përdorimit të bibliotekave të mëposhtme:

  • Aura.Filtër
  • Respekte Vleresimin
  • Vleresimi i Siriusit
  • Valitron
  • kontrollin
  • Një "shembull i botës reale" mund të duket shumë i thjeshtë. Më duhet të pajtohem, pasi, në të vërtetë, disa aftësi bibliotekare u lanë jashtë artikullit. Në parim, nëse jeni të interesuar, mund t'i studioni vetë tiparet e tyre.


    Secila prej bibliotekave ofron veçoritë e veta dhe ka anët e saj të errëta, ndaj mendoj se është çështje shije dhe sfide të zgjedhësh atë.


    Faleminderit per leximin. Bëni zgjedhjen e duhur.

    Etiketa: Shtoni etiketa

    Laravel vjen me një sistem të thjeshtë dhe miqësor për përdoruesit për vërtetimin (kontrollimin e të dhënave hyrëse kundrejt rregullave) dhe marrjen e mesazheve të gabimit - klasën Validation.

    Shembulli më i thjeshtë i vlefshmërisë $validator = Validator::make(array("name" => "Dale"), array("name" => "required|min:5"));

    Parametri i parë që i kalon metodës make është të dhënat që do të testohen. Parametri i dytë janë rregullat që duhet të zbatohen ndaj tyre.

    Përdorimi i vargjeve për të specifikuar rregullat

    Rregulla të shumta mund të ndahen ose me një vijë të drejtë (|) ose të jenë elementë individualë të grupit.

    $validator = Validator::make(array("emri" => "Dale"), array("name" => varg("kërkohet", "min:5")));

    Vleresimi i fushave te shumta $validator = Validator::make(array("name" => "Dale", "password" => "password", "email" => " [email i mbrojtur]"), array("emri" => "kërkohet", "fjalëkalimi" => "kërkohet|min:8", "email" => "kërkohet|email|unik"));

    Pasi të jetë krijuar një shembull Validator, metoda dështon (ose kalon) mund të përdoret për të kryer verifikimin.

    Nëse ($validator->dështon()) ( // Verifikimi i të dhënave të transmetuara dështoi)

    Nëse Validator gjen gabime, ju mund të merrni mesazhet e tij si kjo:

    $mesazhe = $validator->mesazhe();

    Ju gjithashtu mund të merrni një sërë rregullash, të dhëna që nuk verifikuan, pa vetë mesazhet:

    $dështuar = $validator->dështuar();

    Kontrollimi i skedarëve

    Klasa Validator përmban disa rregulla fillestare për vërtetimin e skedarëve, të tilla si madhësia, mimat dhe të tjera. Për të kryer kontrolle në skedarë, thjesht transferoni skedarët së bashku me të dhëna të tjera.

    Hook pas vërtetimit

    Pas përfundimit të vërtetimit, Laravel mund të ekzekutojë funksionin tuaj të mbylljes, në të cilin, për shembull, mund të kontrolloni diçka të veçantë ose të shtoni një lloj mesazhi gabimi. Metoda after() përdoret për këtë:

    $validator = Validator::make(...); $validator->after(function($validator) ( if ($this->somethingElseIsInvalid()) ( $validator->errors()->add("field", "Diçka nuk shkon me këtë fushë!"); ) )); nëse ($validator->dështon()) ( // )

    Nëse është e nevojshme, mund të shtoni shumë pas.

    Validimi në kontrollues

    Shkrimi i kodit të plotë të vërtetimit çdo herë që ju duhet të vërtetoni të dhënat është i papërshtatshëm. Prandaj, Laravel ofron disa zgjidhje për të thjeshtuar këtë procedurë.

    Kontrolluesi i aplikacionit bazë\Http\Controllers\Controller përfshin tiparin ValidatesRequests, i cili tashmë përmban metoda për vërtetim:

    /** * Ruani postimin e blogut. * * @param Kërkesë $kërkesë * @return Përgjigja */ ruajtja e funksionit publik(Kërkesë $kërkesë) ($this->validate($request, [ "title" => "required|unike|max:255", "body" => "kërkohet", ]); // )

    Nëse vërtetimi kalon, kodi vazhdon të ekzekutohet. Nëse jo, hidhet një Illuminate\Contracts\Validation\ValidationException. Nëse nuk e kapni këtë përjashtim, korniza do ta kapë atë, do të mbushë variablat flash me mesazhe gabimi të vërtetimit dhe do ta ridrejtojë përdoruesin në faqen e mëparshme me formularin - vetë!

    Në rastin e një kërkese AJAX, ridrejtimi nuk ndodh; korniza kthen një përgjigje me kodin HTTP 422 dhe JSON me gabime vërtetimi.

    Kodi i mësipërm është i ngjashëm me këtë:

    /** * Ruani postimin e blogut. * * @param Kërkesë për $kërkesë * @return Përgjigja */ ruajtja e funksionit publik(Kërkesë për $kërkesë) ( $v = Validator::make($request->all(), [ "title" => "required|unike|maks. :255", "body" => "kërkohet", ]); nëse ($v->dështon()) (kthimi i ridrejtimit()->back()->withErrors($v->gabimet()); ) //)

    Ndryshimet e formatit të gabimit

    Nëse dëshironi të personalizoni mesazhet e gabimit të vlefshmërisë që ruhen në variablat e flashit të sesionit gjatë një ridrejtimi, anashkaloni metodën formatValidationErrors në kontrolluesin tuaj:

    /** * (@inheritdoc) */ i mbrojtur i funksionit formatValidationErrors(\Ndriçimi\Validation\Validator $validator) ( return $validator->errors()->all(); ) Vleresimi i kerkeses

    Për të zbatuar skenarë më kompleksë të vlefshmërisë, mund ta gjeni të përshtatshme të përdorni të ashtuquajturat Kërkesa Formash. Këto janë klasa të veçanta të kërkesave HTTP që përmbajnë logjikën e vlefshmërisë. Ata e përpunojnë kërkesën përpara se ajo të arrijë te kontrolluesi.

    Për të krijuar një klasë kërkesash, përdorni komandën make:request artisan:

    Php artisan make: request StoreBlogPostRequest

    Klasa do të krijohet në dosjen app/Http/Requests. Shtoni rregullat e nevojshme të vlefshmërisë në metodën e rregullave të saj:

    /** * Merrni rregullat e vlefshmërisë që vlejnë për kërkesën. * * grupi @return */ rregullat e funksionit publik() (kthimi [ "title" => "kërkohet|unik|max:255", "body" => "kërkohet", ]; )

    Në mënyrë që korniza të përgjojë kërkesën përpara kontrolluesit, shtoni këtë klasë në argumentet e metodës së kërkuar të kontrolluesit:

    Me përdorimin e duhur të vlefshmërisë së pyetjes, mund të jeni të sigurt që kontrollorët tuaj përmbajnë gjithmonë vetëm të dhëna hyrëse të vërtetuara!

    Në rast të verifikimit të pasuksesshëm, korniza mbush variablat flash me gabime vërtetimi dhe kthen një ridrejtim në faqen e mëparshme. Në rastin e një kërkese AJAX, kthehet një përgjigje me kodin 422 dhe JSON me gabime validimi.

    Kontrolli i aksesit

    Klasat Form Request përmbajnë gjithashtu një metodë autorizimi. Në këtë metodë, mund të kontrolloni nëse përdoruesi lejohet të kryejë këtë veprim, përditësoni një burim të caktuar. Për shembull, nëse një përdorues përpiqet të modifikojë një koment në një postim, a është ai autori?

    /** * Përcaktoni nëse përdoruesi është i autorizuar për të bërë këtë kërkesë. * * @return bool */ funksioni publik autorize() ( $commentId = $this->rrugë ("koment"); kthej Koment::where("id", $commentId) ->where ("user_id", Auth: :id())->ekziston();)

    Vini re thirrjen e metodës route() më sipër. Kjo metodë ju jep akses në parametrat në url (në këtë rast (koment)) të përcaktuar në itinerarin:

    Rruga::post("koment/(koment)");

    Nëse metoda e autorizimit kthehet false, korniza gjeneron një përgjigje me kodin HTTP 403 dhe e dërgon atë menjëherë. Metoda e kontrolluesit nuk është ekzekutuar.

    /** * Përcaktoni nëse përdoruesi është i autorizuar për të bërë këtë kërkesë. * * @return bool */ funksioni publik autorize() (kthim i vërtetë; )

    Ndryshimet e formatit të gabimit në variablat e Flash

    Nëse dëshironi të personalizoni mesazhet e gabimit të vlefshmërisë që ruhen në variablat e flashit të sesionit gjatë një ridrejtimi, anashkaloni metodën formatValidationErrors në klasën e kërkesës bazë (App\Http\Requests\Request):

    /** * (@inheritdoc) */ i mbrojtur formati i funksionitValidationErrors(\Illuminate\Validation\Validator $validator) ( return $validator->errors()->all(); ) Puna me mesazhe gabimi

    Pasi të telefononi metodën e mesazheve të objektit Validator, do të merrni një objekt MessageBag, i cili ka një sërë metodash të dobishme për të hyrë në mesazhet e gabimit.

    Marrja e mesazhit të parë për fushën echo $messages->first("email"); Marrja e të gjitha mesazheve për një fushë foreach ($messages->get("email") si $message) ( // ) Marrja e të gjitha mesazheve për të gjitha fushat foreach ($messages->all() si $message) ( // ) Vërtetimi për praninë e një mesazhi për fushën nëse ($messages->has("email")) ( // ) Marrja e një gabimi në formatin e specifikuar echo $messages->first("email", "");

    Shënim: Si parazgjedhje, postimet janë të formatuara për t'iu përshtatur Twitter Bootstrap.

    Marrja e të gjitha mesazheve në një format të caktuar në foreach ($messages->all("
  • :mesazh
  • ") si $message) ( // ) Gabimet dhe modelet

    Pasi të keni bërë vërtetimin tuaj, do t'ju duhet një mënyrë e thjeshtë për të kaluar gabimet në shabllon. Laravel e bën këtë të lehtë për t'u bërë. Për shembull, ne kemi rrugët e mëposhtme:

    Route::get("register", function() ( return View::make("user.register"); )); Rruga::post("regjistrohu", funksioni() ( $rules = grup(...); $validator = Validator::make(Input::all(), $rules); nëse ($validator->dështon( )) ( kthimi i ridrejtimit ("regjistrim")->me gabime ($validator); ) ));

    Vini re se kur kontrollet dështojnë, ne ia kalojmë objektin Validator objektit Redirect duke përdorur metodën withErrors. Kjo metodë do të ruajë mesazhet e gabimit në variablat e ndezjes së sesionit një herë, duke i bërë kështu të disponueshme për kërkesën tjetër.

    Megjithatë, vini re se ne nuk po kalojmë View::make("user.register"); $errors variablat në shabllon. Vetë Laravel kontrollon të dhënat e sesionit për praninë e variablave dhe automatikisht i kalon ato në shabllon nëse ato janë të disponueshme. Prandaj, është e rëndësishme të mbani mend se ndryshorja $errors do të jetë e disponueshme për të gjithë shabllonet tuaja në çdo kohë, me çdo kërkesë. . Kjo ju lejon të supozoni se ndryshorja $errors është gjithmonë e përcaktuar dhe mund të përdoret në mënyrë të sigurt. Ndryshorja $errors është një shembull i klasës MessageBag.

    Pra, pas ridrejtimit, mund të përdorni variablin $errors të vendosur automatikisht në shabllon:

    Me emrin Message Bag

    Nëse keni disa forma në faqe, atëherë mund të zgjidhni emrin e objektit MessageBag në të cilin do të kthehen tekstet e gabimit në mënyrë që t'i shfaqni ato në mënyrë korrekte për formën e dëshiruar.

    Ridrejtimi i kthimit("regjistrohu")->me gabime($validator, "hyrja");

    Merrni tekst gabimi nga MessageBag me hyrjen në emër:

    Rregullat e Validimit

    Më poshtë është një listë e të gjitha rregullave të disponueshme dhe funksionet e tyre:

    pranuar

    Fusha duhet të ketë vlerë po, ose 1 . Kjo është e dobishme për të kontrolluar pranimin e rregullave dhe licencave.

    aktive_url

    Fusha duhet të jetë një URL e vlefshme, e aksesueshme përmes funksionit checkdnsrr.

    pas: datë

    Fusha duhet të jetë një datë më vonë se datë

    alfa

    Fusha duhet të përmbajë vetëm karaktere alfabetike.

    alfa_dash

    Fusha duhet të përmbajë vetëm karaktere alfabetike, numra, nënvizime (_) dhe viza (-).

    alfa_num

    Fusha duhet të përmbajë vetëm karaktere alfabetike dhe numra.

    varg

    Fusha duhet të jetë një grup.

    para: datë

    Fusha duhet të jetë një datë më e hershme se datë. Vargjet konvertohen në data duke përdorur funksionin strtotime.

    ndërmjet: min,maksimumi

    Fusha duhet të ketë një madhësi që varion nga min përpara maksimumi. Vargjet, numrat dhe skedarët trajtohen në mënyrë të ngjashme me rregullin e madhësisë.

    logjike

    Fusha duhet të jetë Boolean. Vlerat e lejuara janë të vërteta, false, 1, 0, "1" dhe "0".

    konfirmuar

    Vlera e fushës duhet të përputhet me vlerën e fushës me atë emër, plus foo_confirmation . Për shembull, nëse kontrollohet fusha e fjalëkalimit, atëherë fusha e konfirmimit të fjalëkalimit që përputhet me vlerën duhet t'i kalohet hyrjes.

    datë

    Fusha duhet të jetë një datë e vlefshme sipas funksionit strtotime.

    formati i datës: format

    Fusha duhet të përputhet me formatin e datës format sipas funksionit data_parse_from_format.

    të ndryshme: fushë

    Vlera e fushës që kontrollohet duhet të jetë e ndryshme nga vlera e fushës fushë.

    email

    Fusha duhet të jetë një adresë e vlefshme emaili.

    ekziston: tabela,kolonë

    Fusha duhet të ekzistojë në tabelën e specifikuar të bazës së të dhënave.

    Lehtë për t'u përdorur:

    "state" => "exists:states"

    Përcaktimi i emrit të fushës në një tabelë:

    "state" => "exists:states,shkurtesë"

    Ju gjithashtu mund të specifikoni më shumë kushte për t'u shtuar në pyetjen "WHERE":

    "email" => "ekziston:staff,email,account_id,1"

    imazh

    Skedari i ngarkuar duhet të jetë një imazh në formatin jpeg, png, bmp, gif ose svg.

    në: foo,bar,...

    Vlera e fushës duhet të jetë një nga sa vijon ( foo, bar etj.).

    numër i plotë

    Fusha duhet të ketë një vlerë të plotë të vlefshme.

    ip

    Fusha duhet të jetë një adresë IP e vlefshme.

    maksimumi: vlerë

    Vlera e fushës duhet të jetë më e vogël ose e barabartë me vlerë

    mimat: foo,bar,...

    Lloji MIME i skedarit të ngarkuar duhet të jetë një nga ato të listuara.

    Lehtë për t'u përdorur:

    "foto" => "mimes:jpeg,bmp,png"

    min: vlerë

    Vlera e fushës duhet të jetë më shumë se vlerë. Vargjet, numrat dhe skedarët trajtohen në mënyrë të ngjashme me rregullin.

    jo në: foo,bar,...

    Vlera e fushës nuk duhet të jetë një nga sa vijon ( foo, bar etj.).

    numerike

    Fusha duhet të ketë një vlerë numerike ose thyesore të vlefshme.

    regex: model

    Fusha duhet të përputhet me shprehjen e rregullt të dhënë.

    Paralajmërim: Kur përdorni këtë rregull, mund t'ju duhet të listoni rregulla të tjera si elemente të grupit, veçanërisht nëse shprehja përmban karakterin tub (|).

    kërkohet

    Fusha që testohet duhet të jetë e pranishme dhe të ketë një vlerë jo bosh.

    kërkohet_nëse: fushë,vlerë,...

    Fusha që testohet duhet të jetë e pranishme dhe të ketë një vlerë jo bosh nëse fusha tjetër fushë i pranishëm dhe ka ndonjë nga kuptimet vlerë.

    kërkohet_me: foo,bar,...

    Të paktën një nga fushat e listuara është e pranishme dhe ka një vlerë jo bosh ( foo, bar etj.).

    kërkohet_me_të gjitha: foo,bar,...

    Fusha që testohet duhet të jetë e pranishme dhe të ketë një vlerë jo bosh, por vetëm nëse të gjitha fushat e listuara janë të pranishme dhe kanë një vlerë jo bosh ( foo, bar etj.).

    kërkohet_pa: foo,bar,...

    Fusha që kontrollohet duhet të jetë e pranishme dhe të ketë një vlerë jo bosh, por vetëm nëse të paktën një nga fushat e listuara nuk është e pranishme ose ka një vlerë boshe ( foo, bar etj.).

    kërkohet_pa_të gjitha: foo,bar,...

    Fusha që kontrollohet duhet të jetë e pranishme dhe të ketë një vlerë jo bosh, por vetëm nëse të gjitha fushat e listuara nuk janë të pranishme ose kanë vlera boshe ( foo, bar etj.).

    njëjtë: fushë

    Fusha duhet të ketë të njëjtën vlerë si fusha fushë.

    madhësia: vlerë

    Fusha duhet të përputhet vlerë madhësia. Për vargjet kjo është gjatësia, për numrat është numri, për skedarët është madhësia në kilobajt.

    zona kohore

    Fusha duhet të përmbajë një identifikues të zonës kohore, një nga ato të listuara në funksionin timezone_identifiers_list php

    unike: tabela,kolonë,përveç,idColumn

    Vlera e fushës duhet të jetë unike në tabelën e dhënë të bazës së të dhënave. Nëse kolona nuk është e specifikuar, do të përdoret emri i fushës.

    Përdorimi i thjeshtë "email" => "unique:users" Specifikimi i një emri fushe në tabelën "email" => "unique:users,email_address" Injorimi i një ID specifike "email" => "unique:users,email_address,10" Duke shtuar kushte shtesë

    Ju gjithashtu mund të specifikoni më shumë kushte për t'u shtuar në pyetjen "WHERE":

    "email" => "unike:users,email_address,NULL,id,account_id,1"

    Në rregullin e mësipërm, vetëm rreshtat me account_id të barabartë me 1 do të përfshihen në kontroll.

    url

    Fusha duhet të jetë një URL e vlefshme.

    Shënim: Përdoret funksioni PHP filter_var

    Rregullat e kushtëzuara

    Ndonjëherë ju duhet të vërtetoni një fushë të caktuar vetëm kur ajo është e pranishme në të dhënat hyrëse. Për ta bërë këtë, shtoni rregullin ndonjëherë:

    $v = Validator::make($data, array("email" => "ndonjëherë|kërkohet|email",));

    Në shembullin e mësipërm, fusha e emailit do të aktivizojë vërtetimin vetëm kur ekziston $data["email"].

    Rregulla komplekse të kushtëzuara

    Ndonjëherë dëshironi që një fushë të ketë një vlerë vetëm nëse një fushë tjetër ka një vlerë, të themi, më të madhe se 100. Ose mund të kërkoni vetëm dy fusha që të kenë një vlerë kur specifikohet edhe një e tretë. Kjo arrihet lehtësisht me rregulla të kushtëzuara. Fillimisht krijoni një objekt Validator me një sërë rregullash statike që nuk ndryshojnë kurrë:

    $v = Validator::make($data, array("email" => "e nevojshme|email", "lojëra" => "kërkohet|numerike",));

    Tani le të themi se aplikacioni juaj është shkruar për koleksionistët e lojërave. Nëse regjistrohet një koleksionist me më shumë se 100 lojëra, atëherë duam t'i pyesim ata pse u duhen kaq shumë. Për shembull, ata mund të kenë një dyqan ose ndoshta thjesht u pëlqen t'i mbledhin ato. Pra, për të shtuar një rregull të tillë të kushtëzuar, ne përdorim metodën Validator.

    $v->ndonjëherë ("arsye", "kërkohet|max:500", funksion($input) ( ktheni $input->lojëra >= 100; ));

    Parametri i parë i kësaj metode është emri i fushës që po kontrollojmë. Parametri i dytë është rregulli që duam të shtojmë nëse funksioni i mbylljes së kaluar (parametri i tretë) kthen true . Kjo metodë ju lejon të krijoni me lehtësi rregulla komplekse të vërtetimit të hyrjes. Ju madje mund të shtoni të njëjtat rregulla të kushtëzuara në fusha të shumta në të njëjtën kohë:

    $v->ndonjëherë(array("arsye", "kosto"), "kërkohet", funksion($input) ( kthe $input->lojëra >= 100; ));

    Shënim: Parametri $input i kaluar në mbyllje është një objekt Illuminate\Support\Fluent dhe mund të përdoret për të lexuar hyrjen dhe skedarët që inspektohen.

    Mesazhet e vetë gabimit

    Ju mund të kaloni mesazhet tuaja të gabimit në vend të atyre të paracaktuar. Ka disa mënyra për ta bërë këtë.

    Kalimi i mesazheve tuaja te Validator $messages = array("required" => "Field:atributi duhet të plotësohet.",); $validator = Validator::make($input, $rules, $messages);

    Shënim: atributi line: do të zëvendësohet me emrin e fushës që kontrollohet. Ju gjithashtu mund të përdorni vargje të tjera të ndryshueshme.

    Përdorimi i variablave të tjerë të vargut $messages = array("same" => "Vlerat e:attribute dhe:other duhet të përputhen.", "size" => "Fusha:atributi duhet të jetë saktësisht:size.", "ndërmjet " => "Vlera e:atributit duhet të jetë nga:min në:max.", "in" => "Fusha:atributi duhet të ketë një nga vlerat e mëposhtme: :values",); Përcaktimi i mesazhit tuaj për një fushë specifike

    Ndonjëherë mund t'ju duhet të specifikoni mesazhin tuaj për një fushë të veçantë.

    $messages = array("email.required" => "Duhet të dimë adresën tuaj të emailit!",);

    Specifikimi i mesazheve tuaja në skedarin e lokalizimit

    Është gjithashtu e mundur të përcaktohen mesazhet e vlefshmërisë në skedarin e lokalizimit në vend që t'i kalohen drejtpërdrejt Validatorit. Për ta bërë këtë, shtoni mesazhe në grupin e personalizuar të skedarit të lokalizimit app/lang/xx/validation.php.

    "custom" => array("email" => array("required" => "Ne duhet të dimë adresën tuaj të emailit!",),),

    Rregullat e veta të vërtetimit Regjistroni rregullin tuaj të vlefshmërisë

    Laravel vjen me shumë rregulla të dobishme jashtë kutisë, por mund t'ju duhet të krijoni tuajat. Një mënyrë për të regjistruar një rregull të personalizuar është përmes metodës Validator::extend.

    Validator::extend("foo", funksioni($atribut, $value, $parameters) ( return $value == "foo"; }); !}

    Shënim: Emri i rregullit duhet të jetë në formatin_me_nënvizime.

    Funksioni i mbylljes së kaluar merr tre parametra: emrin e fushës që kontrollohet $attribute , vlerën e fushës $value dhe grupin e parametrave $parametra të kaluar në rregull.

    Në vend të një funksioni, ju mund të kaloni një referencë për një metodë të klasës në metodën e zgjerimit:

    Validator::extend("foo", "FooValidator@validate");

    Vini re se do t'ju duhet gjithashtu të përcaktoni një mesazh gabimi për rregullin e ri. Ju mund ta bëni këtë ose duke e kaluar atë si një grup vargjesh në Validator, ose duke e shkruar atë në një skedar lokalizimi.

    Zgjerimi i klasës Validator

    Në vend që të përdorni funksionet e mbylljes për të zgjeruar grupin e rregullave të disponueshme, mund të zgjeroni vetë klasën Validator. Për ta bërë këtë, krijoni një klasë që trashëgon Illuminate\Validation\Validator. Mund të shtoni metoda të reja vërtetimi duke e filluar emrin e tyre me validate .

    Artikujt më të mirë mbi këtë temë