Bahay / Pangkalahatang-ideya ng Linux / Napatunayan, napatunayan... at napatunayan! Paghahambing ng mga validator ng data sa PHP. Pagpapatunay at paglilinis ng data gamit ang PHP Insane validation php

Napatunayan, napatunayan... at napatunayan! Paghahambing ng mga validator ng data sa PHP. Pagpapatunay at paglilinis ng data gamit ang PHP Insane validation php

Napakahalaga na ma-validate ang input sa iyong form bago kunin ang data ng pagsusumite ng form para sa karagdagang pagproseso. Kapag maraming field sa form, nagiging masyadong kumplikado ang PHP validation script. Bukod dito, dahil pareho o katulad na pagpapatunay ang ginagawa mo para sa karamihan ng mga form na iyong ginagawa, napakaraming dobleng pagsisikap ang ginugugol sa mga pagpapatunay ng form.

Tungkol sa generic na PHP form validation script na ito

Ang generic na PHP form validator script na ito ay napakadaling magdagdag ng mga validation sa iyong form.

Gumagawa kami at nag-uugnay ng isang hanay ng mga "deskriptor ng pagpapatunay" sa bawat elemento sa form. Ang "validation descriptor" ay isang string na tumutukoy sa uri ng validation na isasagawa. Halimbawa, ang ibig sabihin ng "req" ay kinakailangan, ang ibig sabihin ng "alpha" ay payagan lamang ang mga alphabetic na character at iba pa.

Ang bawat field sa form ay maaaring magkaroon ng zero, isa o higit pang mga pagpapatunay. Halimbawa, hindi dapat walang laman ang input, dapat mas mababa sa 25 char, dapat alpha-numeric, atbp

Maaari kang mag-ugnay ng isang set ng mga validation descriptor para sa bawat input field sa form.

I-download ang PHP form validation script

Maaari mong i-download ang PHP form validation script sa ibaba:
Ang zip file ay naglalaman ng form validation script formvalidator.php, dokumentasyon at mga sample ng paggamit.

Gamit ang PHP form validation script
  • Isama ang formvalidator.php sa iyong script sa pagpoproseso ng form
  • require_once "formvalidator.php"
  • Lumikha ng object ng FormValidator at idagdag ang mga deskriptor ng pagpapatunay ng form.
  • $validator = bagong FormValidator(); $validator->addValidation("Pangalan","req","Pakilagay ang Pangalan"); $validator->addValidation("Email","email", "The input for Email should be a valid email value"); $validator->addValidation("Email","req","Mangyaring punan ang Email");

    Ang unang argumento ay ang pangalan ng input field sa form. Ang pangalawang argumento ay ang validation descriptor na nagsasabi sa uri ng validation na kinakailangan. Ang ikatlong argumento ay ang mensahe ng error na ipapakita kung nabigo ang pagpapatunay.

  • I-validate ang form sa pamamagitan ng pagtawag sa ValidateForm() function
  • if(!$validator->ValidateForm()) ( echo "Mga Error sa Pagpapatunay:"; $error_hash = $validator->GetErrors(); foreach($error_hash bilang $inpname => $inp_err) ( echo "

    $inpname: $inp_err

    \n"; ) ) Halimbawa

    Ang halimbawa sa ibaba ay gagawing mas malinaw ang ideya

    Pangalan: Email:

    Pagdaragdag ng Custom Validation

    Kung gusto mong magdagdag ng custom na validation, na hindi ibinigay ng validation descriptors, magagawa mo ito. Narito ang mga hakbang:

  • Gumawa ng klase para sa custom na pagpapatunay at i-override ang DoValidate() function
  • class MyValidator extends CustomValidator ( function DoValidate(&$formars,&$error_hash) ( if(stristr($formars["Comments"],"http://")) ($error_hash["Comments"]="No URLs allowed sa mga komento"; ibalik ang mali; ) ibalik ang totoo; ) )

  • Idagdag ang custom na validation object
  • $validator = bagong FormValidator(); $validator->addValidation("Pangalan","req","Pakilagay ang Pangalan"); $validator->addValidation("Email","email", "The input for Email should be a valid email value"); $validator->addValidation("Email","req","Mangyaring punan ang Email"); $custom_validator = bagong MyValidator(); $validator->AddCustomValidator($custom_validator);

    Awtomatikong tatawagin ang custom na pagpapatunay pagkatapos ng iba pang pagpapatunay.

    Talaan ng mga Deskriptor ng Pagpapatunay

    Narito ang listahan ng lahat ng validation descriptors:

    Deskriptor ng PagpapatunayPaggamit
    reqHindi dapat walang laman ang field
    maxlen=???sinusuri ang haba ng inilagay na data sa maximum. Halimbawa, kung ang maximum na laki na pinahihintulutan ay 25, ibigay ang validation descriptor bilang "maxlen=25"
    minlen=???sinusuri ang haba ng ipinasok na string sa kinakailangang minimum. halimbawa "minlen=5"
    alnumSuriin ang data kung naglalaman ito ng anumang iba pang mga character maliban sa mga alphabetic o numeric na character
    alnum_sPinapayagan lamang ang mga character na alphabetic, numeric at space
    numSuriin ang numeric data
    alphaSuriin ang alpabetikong data.
    alpha_sSuriin ang alpabetikong data at payagan ang mga puwang.
    emailAng field ay isang email field at i-verify ang validity ng data.
    lt=???
    lessthan=???
    I-verify na mas mababa ang data kaysa sa value na ipinasa. Wasto lamang para sa mga numeric na field.
    halimbawa: kung ang halaga ay dapat na mas mababa sa 1000 bigyan ang paglalarawan ng pagpapatunay bilang "lt=1000"
    gt=???
    mas malaki=???
    I-verify na mas malaki ang data kaysa sa value na ipinasa. Wasto lamang para sa mga numeric na field.
    halimbawa: kung ang halaga ay dapat na mas malaki sa 10 bigyan ang paglalarawan ng pagpapatunay bilang "gt=10"
    regexp=???Suriin gamit ang isang regular na expression ang halaga ay dapat tumugma sa regular na expression.
    halimbawa: "regexp=^(1.20)$" ay nagbibigay-daan sa hanggang 20 alphabetic na character.
    dontselect=??Ang validation descriptor na ito ay para sa mga piling input item (listahan) Karaniwan, ang mga piling list box ay magkakaroon ng isang item na nagsasabing 'Select One'. Dapat pumili ang user ng opsyon maliban sa opsyong ito. Kung ang value ng opsyong ito ay ‘Select One’, ang validation description ay dapat na “dontselect=Select One”
    dontselectchkAng validation descriptor na ito ay para sa mga check box. Hindi dapat piliin ng user ang ibinigay na check box. Ibigay ang halaga ng check box sa halip na ??
    Halimbawa, dontselectchk=on
    shouldselchkAng validation descriptor na ito ay para sa mga check box. Dapat piliin ng user ang ibinigay na check box. Ibigay ang halaga ng check box sa halip na ??
    Halimbawa, shouldselchk=on
    dontselectradioAng validation descriptor na ito ay para sa mga radio button. Hindi dapat piliin ng user ang ibinigay na radio button. Ibigay ang halaga ng radio button sa halip na ??
    Halimbawa, dontselectradio=NO
    piling radyoAng validation descriptor na ito ay para sa mga radio button. Dapat piliin ng user ang ibinigay na radio button. Ibigay ang halaga ng radio button sa halip na ??
    Halimbawa, selectradio=yes
    selmin=??Pumili ng hindi bababa sa n bilang ng mga check box mula sa isang pangkat ng check box.
    Halimbawa: selmin=3
    nag-iisaGinagawang mandatory ang isang grupo sa radyo. Ang gumagamit ay dapat pumili ng kahit isang item mula sa pangkat ng radyo.
    eqelmnt=???ihambing ang dalawang elemento sa form at siguraduhin na ang mga halaga ay pareho. Halimbawa, 'password' at 'kumpirmahin ang password'. Palitan ang ??? na may pangalan ng iba pang elemento ng pag-input.
    Halimbawa: eqelmnt=confirm_pwd

    Sa isang nakaraang artikulo nangako akong magsulat ng paghahambing ng sarili kong library sa iba pang magagamit na mga solusyon, kaya titingnan natin ngayon ang pagpapatunay gamit ang Aura.Filter, Respect Validation, Sirius Validation at Valitron.


    Isipin natin na mayroon tayong partikular na pampublikong serbisyo sa pag-unlad na kinabibilangan ng pagpaparehistro ng mga user para sa ganap na pag-access sa lahat ng function. Kaya, ang registration form ay maglalaman ng mga sumusunod na field:

  • pangalan.
  • Dapat maglaman ng eksaktong dalawang salita, kung saan ang una ay ang pangalan ng gumagamit at ang pangalawa ay ang apelyido.
  • login. Kung naipasa ang isang halaga, dapat ay naglalaman lamang ito ng mga Latin na letra, gitling at salungguhit..
  • email.
  • Dapat maglaman ng wastong address
  • email


    password.

    Dapat itakda at hindi hihigit sa 64 na character ang haba.

    sumang-ayon.

    Isang karaniwang checkbox na dapat suriin ng isang user upang kumpirmahin ang kanilang pagtanggap sa mga tuntunin ng serbisyo.

  • Kaya, mayroon kaming limang field na dapat punan ng user para makapagrehistro sa aming haka-haka na serbisyo. Isipin natin na nakatanggap kami ng ganap na di-wastong data bilang input:
  • $data = [ "pangalan" => "Albert", // Dapat ay dalawang salitang "login" => "@lbert", // "Bawal" na karakter @ "email" => "may mali", / / ​​Dapat maging isang e-mail na "password" => Aura.Filter
  • Ang pagpapatunay gamit ang Aura.Filter ay nagsisimula sa isang pabrika ng filter. Kailangan nating lumikha ng tinatawag na "filter ng paksa", dahil patunayan natin ang isang array, hindi isang indibidwal na halaga.
  • Tinutukoy namin ang mga panuntunan gamit ang Aura\Filter\FilterFactory; $filter = (bagong FilterFactory)->newSubjectFilter(); $filter->validate("name") ->isNotBlank() ->is("two_words") ->setMessage("Ang pangalan ay dapat dalawang salita."); $filter->validate("login") ->isBlankOr("alnum") ->setMessage("Kung tumukoy ka ng login, dapat ay naglalaman lamang ito ng mga Latin na character."); $filter->validate("email") ->isNotBlank() ->is("email") ->setMessage("Mangyaring magpasok ng wastong email address."); $filter->validate("password") ->isNotBlank() ->is("strlenMax", 64) ->setMessage("Pakisulat ang iyong password."); $filter->validate("agreed") ->is("callback", function($subject, $field) ( return $subject->($field) === true; ))->setMessage("Kailangan mo sumang-ayon sa mga tuntunin ng serbisyo.");
  • Tulad ng nakikita mo, ang paglalarawan ng mga patakaran ay medyo simple. Nagbibigay ang Aura.Filter ng isang buong hanay ng mga kapaki-pakinabang na panuntunan sa labas ng kahon at ang ilan sa mga ito ay ginamit sa halimbawa sa itaas: isNotBlank na paraan. Tinutukoy na ang field ay hindi maaaring magkaroon ng null value.
  • Marahil ay napansin mo na hindi ko tinukoy ang panuntunan ng two_words. Naturally, walang ganoong panuntunan sa Aura.Filter, kaya kailangan nating gumawa ng isa. Tulad ng sinasabi ng dokumentasyon, ginagawa ito gamit ang isang hiwalay na klase para sa panuntunan:


    /** * Panuntunan na nagpapatunay sa username.

    * Ang username ay binubuo ng dalawang salita: una at apelyido, na pinaghihiwalay ng isang puwang.


    */ class UserNameRule ( /** * Pinapatunayan ang user name. * * @param object|array $subject * @param string $field * @param int $max * * @return bool */ public function __invoke($subject, $ field , $max = null) ($value = $subject->($field); if (! is_scalar($value)) ( return false; ) return (bool) preg_match("/^+\s+$/u" , $value);


    Ang ikalawang hakbang ay ipaalam sa pabrika ng filter ang tungkol sa aming bagong panuntunan. Ginagawa ito sa pamamagitan ng pagpasa ng unang argumento bilang isang hanay ng mga panuntunan sa pabrika ng filter:

    Ang susunod na hakbang ay ipaalam sa Aura.Filter na nakagawa kami ng bagong panuntunan at gusto namin itong gamitin. Ginagawa ito sa pamamagitan ng pagpasa ng hanay ng mga panuntunan sa unang argumento ng pabrika:

    gamitin ang Aura\Filter\FilterFactory; $rules = [ "two_words" => function() ( ibalik ang bagong UserNameRule; ) ]; $filter = (bagong FilterFactory($rules))->newSubjectFilter();

    Ngayon ang aming two_words rule ay maaaring gamitin sa parehong paraan tulad ng anumang iba pang karaniwang tuntunin.


    Feedback


    Tulad ng naaalala mo, ang papasok na data na aming pinapatunayan ay ganap na hindi wasto, dahil ang bawat field ay naglalaman ng isang maling halaga o hindi ito naglalaman ng lahat. Samakatuwid, ipinapalagay na bilang resulta ng pagpapatunay ay makakatanggap kami ng mga error at kaukulang mensahe tungkol sa kanila.

    Pina-validate namin gamit ang Aura.Filter gaya ng sumusunod: $valid = $filter->apply($data); kung (! $valid) ($failures = $filter->getFailures(); $messages = $failures->getMessages(); ) SA


    $mga mensahe

    isang array ang isinusulat, kaya para magpakita ng mga mensahe kailangan namin ng dalawang nested foreach:


    Igalang ang Pagpapatunay


    gamitin ang Respect\Validation\Validator bilang v; $data = [ "pangalan" => "Albert", // Dapat ay dalawang salitang "login" => "@lbert", // "Bawal" na karakter @ "email" => "may mali", / / ​​Dapat maging isang e-mail dito "password" => "" // Ang password ay hindi tinukoy sa lahat // "sumang-ayon" ay wala sa array dahil hindi nilagyan ng tsek ng user ang kahon ];

    Pagtukoy sa mga tuntunin


    Tulad ng sa Aura.Filter, kailangan namin ng sarili naming panuntunan sa pagpapatunay para sa username, kaya magsimula tayo doon:

    namespace MyNamespace; gamitin ang Respect\Validation\Rules\AbstractRule; class UserNameRule extends AbstractRule ( public function validate($input) ( return (bool) preg_match("/^+\s+$/u", $input); ) )


    Ang external rules API ay halos magkapareho sa Aura.Filter, ang validate() method lang ang ginagamit sa halip na __invoke() magic. Para sa akin, ang API na ito, mas simple at mas naiintindihan. Well, mas malapit ito sa Kontrolio :).


    Wala akong nakitang anumang pagbanggit nito sa dokumentasyon, gayunpaman, bilang karagdagan sa panuntunan mismo, kailangan mong lumikha ng iyong sariling uri ng pagbubukod para dito. Ang pangalan ng exception class ay dapat na binubuo ng pangalan ng rule class at isang postfix

    Exception


    gamitin ang Respect\Validation\Exceptions\NestedValidationException; pinapalawak ng class UserNameRuleException ang NestedValidationException ( // )

    Well, sa wakas ma-validate na namin ang aming data. Una, ipinapasa namin ang aming bagong panuntunan sa validator upang malaman niya ang tungkol dito at magamit namin ito sa hinaharap. Sa Respect Validation, ito ay ginagawa sa pamamagitan ng pagtawag sa with() method, na ipinapasa ang namespace kung saan matatagpuan ang mga non-standard na panuntunan. v::with("MyNamespace\\"); Ngayon ang lahat ng hindi karaniwang mga panuntunan ay matatagpuan sa namespace


    MyNamespace

    , ay "makikilala" ng validator. Ang susunod na hakbang ay ilarawan ang mga kinakailangang tuntunin at magsagawa ng pagpapatunay. v::attribute("name", v::userNameRule()) ->attribute("login", v::alnum("-_")) ->attribute("email", v::email()) ->attribute("password", v::notEmpty()->stringType()->length(null, 64)) ->attribute("agreed", v::trueVal()) ->assert((object) $data); Pansinin kung paano namin inilalapat ang aming panuntunan sa katangian


    pangalan . Dito ang pangalan ng klase ng panuntunan ay binago sa pangalan ng pamamaraan ng validator. Ang natitirang mga panuntunan ay, sa pangkalahatan, madaling maunawaan. Ito ay nagkakahalaga ng pagbanggit nang hiwalay kung bakit namin ibinibigay ang array

    gamitin ang Aura\Filter\FilterFactory; $rules = [ "two_words" => function() ( ibalik ang bagong UserNameRule; ) ]; $filter = (bagong FilterFactory($rules))->newSubjectFilter();

    Hindi tulad ng Aura.Filter, ang Respect validator ay naghagis ng exception kapag nabigo ang validation. At ang pagbubukod na ito ay naglalaman ng mga mensahe ng error sa pagpapatunay. Samakatuwid, ang halimbawang ipinakita lamang ay dapat na isulat tulad ng sumusunod:


    subukan ( 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("sumang-ayon", v::trueVal()) ->assert((object) $data ) catch (NestedValidationException $ex) ( $messages = $ex->getMessages(); )

    Gamit ang getMessages() makakakuha tayo ng flat array ng lahat ng mensahe na nakolekta ng validator sa panahon ng proseso ng validation. Sa pamamagitan ng paglalaglag ng array, nakakakuha tayo ng ganito:


    array(5) ( => string(29) “Nabigo ang pagpapatunay ng data para sa %s” => string(60) “ang pag-login ay dapat maglaman lamang ng mga titik (a-z), digit (0–9) at “-_”” => string (25) “dapat wastong email ang email” => string(26) “hindi dapat walang laman ang password” => string(32) “Dapat naroroon ang attribute na napagkasunduan” )

    Maaari mong baguhin ang mga mensahe sa iyong sarili. Marahil ay hindi ko naintindihan ang library na ito, ngunit ang prosesong ito ay tila hindi masyadong halata sa akin: kailangan mong gamitin ang findMessages() na paraan sa isang pinangangasiwaan na pagbubukod, kung saan tinukoy mo ang mga mensahe hindi para sa mga katangian, ngunit para sa mga panuntunan.


    $ex->findMessages([ "userNameRule" => "Ang username ay dapat binubuo ng dalawang salita.", "alnum" => "Hindi namin gusto ang iyong login.", "email" => "Malinaw na ayaw mo gusto mong ibigay sa amin ang iyong e-mail.", "notEmpty" => "Well, nasaan ang iyong password?", "agreed" => "Nakakalungkot na hindi ka sumasang-ayon." ]);

    Hindi ko alam kung ano ang mali, ngunit may ilang mga bagay na hindi ko pa rin maintindihan. Ito ang nakukuha natin sa pamamagitan ng pagtukoy sa mga panuntunan sa paraan sa itaas:


    array(5) ( => string(40) “Dapat na dalawang salita ang username.” => string(31) “Hindi namin gusto ang iyong login.” => string(25) “dapat valid na email ang email” = > string(5) “Well, where is your password?” => string(9) “Sayang na hindi ka pumayag.”

    Tulad ng nakikita mo, ang mensahe para sa field ng email ay hindi inilapat, ang pamantayan ay nanatili. Ngunit ang mensahe sa index 4 ay kabaligtaran! At ito sa kabila ng katotohanan na hindi ko ginamit ang pangalan ng panuntunan, ngunit ang pangalan ng patlang. Samantalang kung ginamit ko ang pangalan ng panuntunan (trueVal), ang aking mensahe ay nawala sa kung saan. Ang mga komento mula sa mga nakaranasang gumagamit ng aklatang ito ay malugod na tinatanggap.

    Pagpapatunay ng Sirius

    Ok, lumipat tayo sa susunod na library at tingnan kung paano nito pinangangasiwaan ang mga katulad na gawain.

    Pagtukoy sa mga tuntunin

    Muli kailangan nating tukuyin ang isang panuntunan para sa username. Isusulat namin ito ng ganito:


    class UserNameRule extends AbstractRule ( // Error Messages const MESSAGE = "Ang username ay dapat dalawang salita."; const LABELED_MESSAGE = "(label) ay dapat dalawang salita."; public function validate($value, $valueIdentifier = null ) ( return (bool) preg_match("/^+\s+$/u", $value);

    Pakitandaan ang pagkakaiba sa mga diskarte kumpara sa mga aklatang natalakay na. Tinutukoy namin ang dalawang uri ng mga mensahe sa mga constant sa halip na gumamit ng mga katangian, pamamaraan o argumento ng panuntunan.


    Ngayon ilarawan natin ang lohika ng pagpapatunay:


    $validator = bagong Validator; $validator ->add("name", "required | MyApp\Validation\Rule\UserNameRule") ->add("login", "required | alphanumhyphen", null, "Ang pag-login ay maaari lamang maglaman ng mga Latin na titik, gitling at salungguhit. ") ->add("email", "required | email", null, "Mangyaring magpasok ng tamang e-mail.") ->add("password", "required | maxlength(64)", null, "Your password, sir.") ->add("agree", "required | equal(true)", null, "Bakit hindi ka pumayag?");

    Tulad ng nakikita mo, ang hanay ng mga patakaran ay napaka-simple at nababasa. Para sa paglalarawan, gumagamit kami ng mga pangalan na pinaghihiwalay ng mga pahalang na bar. Ang diskarte na ito ay katulad ng ginamit sa Laravel at Kontrolio.


    Ang ikaapat na argumento sa paraan ng add() ay naglalarawan ng mensahe ng error sa pagpapatunay na gagamitin ni Sirius kung nabigo ang pagpapatunay. Bakit hindi kami nagdagdag ng mensahe para sa aming bagong panuntunan? UserNameRule?


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

    Ito ay dahil ang mga mensahe ay inilarawan na sa mga constant ng klase:


    class UserNameRule extends AbstractRule ( // Error messages const MESSAGE = "Ang username ay dapat dalawang salita."; ...

    Ang isa pang pagpipilian ay ang paggamit ng addMessage() na paraan ng validator mismo:


    $validator->addMessage("email", "Mangyaring magpasok ng wastong e-mail.");

    Pakitandaan na ang mga custom na panuntunan ay tinutukoy ng buong pangalan ng kanilang klase, habang sa Kontrolio maaari kang tumukoy ng alias/alias.

    gamitin ang Aura\Filter\FilterFactory; $rules = [ "two_words" => function() ( ibalik ang bagong UserNameRule; ) ]; $filter = (bagong FilterFactory($rules))->newSubjectFilter();

    Upang maisagawa ang pagpapatunay, tinatawag namin ang validator method validate() , na ipinapasa ang data dito:


    $data = [ "pangalan" => "Albert", // Dapat ay dalawang salitang "login" => "@lbert", // "Bawal" na karakter @ "email" => "may mali", / / ​​Dapat maging isang e-mail dito "password" => "" // Ang password ay hindi tinukoy sa lahat // "sumang-ayon" ay wala sa array dahil hindi nilagyan ng tsek ng user ang kahon ]; $validator->validate($data);

    Hindi tulad ng Paggalang, si Sirius ay hindi magtapon ng eksepsiyon, ngunit babalik lamang mali. Maaaring makuha ang mga mensahe ng error sa pagpapatunay sa pamamagitan ng getMessages() validator method. Ibinabalik nito ang mga error na naka-grupo ayon sa mga attribute, kaya kailangan namin ng dalawang foreach loops upang dumaan sa mga error:


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

    Narito ang $message ay isang bagay ng klase Sirius\Validation\ErrorMessage, na mayroong getTemplate() method na nagbabalik ng mismong mensaheng kailangan namin.

    Valitron Pagtukoy sa mga patakaran

    Ang unang pagkakaiba: upang magdagdag ng bagong panuntunan, hindi mo kailangang gumawa ng hiwalay na klase. Maaari ka lang gumamit ng pagsasara na nagbabalik ng boolean na resulta.


    Upang magdagdag ng mga custom na panuntunan, ang Valitron ay may static na paraan addRule(), kung saan ang unang dalawang argumento ay kinakailangan, at ang pangatlo ay opsyonal. Nagustuhan ko ang pamamaraang ito, dahil dito nakasaad ang rule identifier, logic at error message sa isang lugar.


    gamitin ang Valitron\Validator; Validator::addRule("two_words", function($field, $value) ( ​​​​return (bool) preg_match("/^+\s+$/u", $value); ), "Ang username ay dapat na eksaktong binubuo ng dalawang salita ");

    Ang pangalawang pagkakaiba ay kung paano inilalapat ang mga panuntunan sa mga katangian. Sa lahat ng nakaraang kaso, nakita namin na ang isang katangian ay, kumbaga, isang pangunahing bagay.


    Ibang ruta ang kinuha ni Valitron at inuna ang mga panuntunan sa pagpapatunay. Sa pamamagitan ng paglalarawan ng mga panuntunan, tila nag-aaplay ka ng mga katangian sa mga panuntunang ito, at hindi kabaliktaran.


    $validator = bagong Validator($data); $validator ->rule("two_words", "name")->label("") ->rule("required", [ "name", "login", "email", "password", "agreed" ] ) ->rule("slug", "login") ->rule("email", "email") ->rule("accepted", "agreed");

    Tulad ng makikita mula sa halimbawa, sa rule() na pamamaraan ay isusulat muna namin ang pangalan ng panuntunan, at pagkatapos ay ipahiwatig ang mga katangian na dapat tumutugma sa panuntunang ito. Ang isang mas tahasang halimbawa ay ang kinakailangang panuntunan, na nagpapakita kung paano "kabilang" ang mga katangian sa panuntunang iyon.


    Ang Valitron (tulad ng iba pang mga solusyon na aming nasuri) ay nagbibigay ng mga karaniwang mensahe ng error. Kung gagamitin mo lang ang mga ito, makikita mo na ang bawat mensahe ay nagsisimula sa pangalan ng kaukulang katangian.


    Pinapalitan ng Valitron ang mga pangalan ng attribute sa text ng mensahe kahit na ginagamit ang mga hindi karaniwang error na mensahe. Iyon ang dahilan kung bakit ginamit namin ang label() na pamamaraan na may walang laman na string upang alisin ang pangalan ng katangian.


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

    Partikular tungkol sa pagpapatunay, ang Valitron library API ay halos hindi naiiba sa kung ano ang nakita na natin sa artikulo. Upang maisagawa ang pagpapatunay, tinatawag namin ang validator method validate() :


    $validator->validate();

    Maaaring makuha ang mga mensahe ng error sa pagpapatunay gamit ang getErrors() method:


    $validator->mga error();

    Ang mga mensahe dito ay pinagsama ayon sa mga katangian sa parehong paraan tulad ng sa Sirius Validation, maliban na walang hiwalay na klase para sa mensahe, at nakakakuha kami ng regular na multi-dimensional na array.


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

    At sa wakas, ang huling aklatan para sa ngayon ay ang sarili kong pag-unlad na tinatawag na Kontrolio.

    Pagtukoy sa mga tuntunin

    Muli, sa ikalimang pagkakataon, gagawa kami ng panuntunan sa pagpapatunay para sa username. Ang lahat ay medyo simple at pamantayan:


    namespace MyProject\Validation\Rules; gumamit ng Kontrolio\Rules\AbstractRule; class TwoWords extends Kontrolio\Rules\AbstractRule ( public function isValid($input = null) ( return (bool) preg_match("/^+\s+$/u", $input); ) )

    Ngayon ay lumikha kami ng isang pabrika at nagrehistro ng isang panuntunan dito gamit ang extend() na paraan:


    namespace MyProject; gumamit ng Kontrolio\Factory; gamitin ang MyProject\Validation\Rules\Twords; $factory = Kontrolio\Factory::getInstance()->extend();

    Pagkatapos irehistro ang panuntunan, magagamit namin ito, kasama ang pangalan - two_words. Gumawa tayo ng validator:


    $data = [ "pangalan" => "Albert", // Dapat ay dalawang salitang "login" => "@lbert", // "Bawal" na karakter @ "email" => "may mali", / / ​​Dapat maging isang e-mail dito "password" => "" // Ang password ay hindi tinukoy sa lahat // "sumang-ayon" ay wala sa array dahil hindi nilagyan ng tsek ng user ang kahon ]; $rules = [ "name" => "two_words", "login" => "minsan|alphadash", "email" => "email", "password" => "length:1.64", "agreed" => " tinanggap" ]; $messages = [ "name" => "Ang username ay dapat binubuo ng dalawang salita.", "login" => "Hindi namin gusto ang iyong login.", "email" => "Malinaw na ayaw mong magbigay us your email .", "password" => "Well, where is your password?", "agreed" => "Nakakalungkot na hindi ka sumasang-ayon." ]; $validator = $factory->make($data, $rules, $messages);

    Inilarawan namin ang mga panuntunan gamit ang isang syntax na katulad ng ginamit sa Laravel, bagama't maaari sana kaming gumamit ng mas verbose na bersyon:


    $rules = [ "pangalan" => bagong TwoWords, "login" => , "email" => bagong Email, "password" => bagong Haba(1, 64), "napagkasunduan" => bagong Tinanggap ];

    Feedback


    $validator->validate();

    Sinimulan ang pagpapatunay gamit ang parehong validate() na pamamaraan:



    Ngayon ay makakakuha tayo ng mga mensahe ng error gamit ang isa sa mga getErrors() o getErrorsList() na mga pamamaraan. Ang unang paraan ay nagbibigay-daan para sa mas kumplikadong output ng error, habang ang pangalawa ay nagbabalik ng isang flat array. Gamit ang getErrors() maaari tayong mag-output ng mga mensahe tulad nito:


    At sa getErrorsList() makakagawa ka ng mas simpleng listahan ng mga mensahe:

    Bottom line

  • Sa artikulong ito nagpakita ako ng mga halimbawa ng paggamit ng mga sumusunod na aklatan:
  • Aura.Filter
  • Pagpapatunay ng Sirius
  • Igalang ang Pagpapatunay
  • Valitron
  • kontrol


    Ang isang "tunay na halimbawa sa mundo" ay maaaring mukhang masyadong simple. Kailangan kong sumang-ayon, dahil, sa katunayan, ang ilang mga kakayahan sa aklatan ay naiwan sa artikulo. Sa prinsipyo, kung interesado ka, maaari mong pag-aralan ang kanilang mga tampok sa iyong sarili.


    Ang bawat isa sa mga aklatan ay nag-aalok ng sarili nitong mga tampok at may mga madilim na panig nito, kaya sa tingin ko ito ay isang bagay ng panlasa at hamon na piliin ang isa.

    Salamat sa pagbabasa. Gumawa ng tamang pagpili.

    Mga Tag: Magdagdag ng mga tag

    Magandang gabi sa lahat (more like night - editor's note). Ngayon ay pagbubutihin natin ng kaunti ang isang iyon. Una, alamin natin kung paano gawin ang pagpapatunay ng form sa PHP at gumawa ng ilang manipulasyon sa seguridad.

    Kaya, tingnan ang code sa ibaba at tandaan ang mga sumusunod na pagbabago at ang mga sumusunod na dahilan para sa mga pagbabago. Na-highlight ko ang lahat ng bagong linya na may kulay.

    Ang pangalan ng mga field ng form ay binago. Maaari mong itanong - bakit kailangan natin ito? Simple lang, sasagutin kita. Sa pagkakaalam ko, sinusuri ng ilang spam bot ang mga site na naghahanap ng mga form at punan ang mga ito batay sa mga pangalan ng mga field na ito. Sa teorya, kung hindi sila makahanap ng isang katugma, pagkatapos ay uuwi sila, na kung ano ang gusto namin. Siyempre, hindi ko akalain na ang antas ng proteksyong ito ay partikular na mahusay, ngunit hindi ito makakasama sa amin, at kung ang mga spam na email ay bumaba ng 1 titik, iyon ay mabuti =). Sinusuri kung tama ang nailagay na email address. Ginagamit ng Line 17 ang elseif operator, na susuriin kung nagbalik ng positibong sagot sa amin, iyon ay, sinabi nito na nawawala ang email address, iyon ay, hindi ito nailagay. Dito ginagamit namin ang function na preg_match, na nagpapahintulot sa amin na ihambing ang inilagay na address sa regular na pagpapahayag . Marahil ay magsusulat ako nang maikli tungkol sa mga regular na expression sa ibang pagkakataon, ngunit sa ngayon ay sulit na malaman iyon lumilikha ng template kung saan sinusuri ang aming string. At kung, sa aming kaso, ang ipinasok na address ay hindi tumutugma sa expression, pagkatapos ay muli ang isang error ay ipapakita. Halimbawa, narito ang ilang mas regular na expression:
    |^[-а-яе\s\.,;:\?!]+$|i– pinapayagan ka ng regular na expression na ito na gumamit lamang ng alpabetong Ruso at ilang mga character tulad ng espasyo, tuldok, kuwit, atbp.
    #http://[-a-z0-9_.]+[-a-z0-9_:@&?=+,.!/~*’%$]*\.(html?|php)#i– at binibigyang-daan ka ng expression na ito na suriin ang tamang spelling ng isang address sa Internet.

    Susunod, ginagamit namin ang iba pang operator, kung saan ang lahat ng aming code para sa pagpapadala ng liham ay nailipat na. Maaari kang lumikha ng mga panuntunan sa pag-verify sa iyong sarili sa anumang dami, magdagdag lamang ng mga bago kung, tulad ng para sa pagsuri ng isang email address, at ikaw ay magiging masaya.




    Makipag-ugnayan sa tao:



    Makipag-ugnayan sa email:



    Mensahe:






    Ito ay kung paano mo mapapatunayan ang iyong mga PHP form nang hindi gumagamit ng anumang bagay na hindi kailangan. Sa susunod na pagkakataon sa isang post sa paksa ng mga form, sa tingin ko, ang pagpapatunay ng mga form sa jQuery ay isasaalang-alang. Samantala, hinihintay ko ang iyong mga komento at kagustuhan. Magandang gabi at magandang umaga sa lahat =).

    Pag-uusapan natin ang tungkol sa pagpapatunay ng POST o GET na data, bagaman sa prinsipyo maaari rin itong ilapat sa data na natanggap ng iba pang mga pamamaraan, tulad ng cookies. Habang bumubuo ka ng anumang web application, kailangan mong magsulat ng isang interface para sa pakikipag-ugnayan sa mga user at natural na lumikha ng iba't ibang mga form para sa mga user na magpadala ng data sa server. halimbawa, ito ay maaaring mga komento. Sa tingin ko, malinaw at halata sa lahat na kailangang suriin ang natanggap na data upang makita kung tumutugma ito sa uri, laki, at tinukoy na saklaw. Una sa lahat, ito ay kinakailangan para sa seguridad ng system, website o database, dahil... Maaaring magbukas ng access sa isang umaatake ang maling naipadalang data o isang kahilingang sadyang hindi maganda ang pagkakabuo.

    Pangalawa, ang hindi na-verify na data, kung hindi tama, ay maaaring maging sanhi ng hindi matatag na operasyon ng script, ang system o ang buong server. Samakatuwid, ang lahat ng data ay kailangang suriin at i-double-check marahil ang isang tao ay magsasabi na hindi na kailangan ng labis na paranoya, ngunit naniniwala ako na sa bagay na ito ay hindi ito maaaring maging labis.

    Huwag magtiwala sa data na natanggap mula sa mga user, sa ilalim ng anumang dahilan, sa anumang sitwasyon. Ito ay nangyayari na kami ay talagang tamad na magsulat ng code na sumusuri sa natanggap na data muli, o inaasahan namin iyon umiiral na mga pamamaraan sapat na ang pagsusuri, bilang resulta kung saan tayo ay gumagawa ng mga konsesyon sa ating sarili.

    Isang maliit na paglihis mula sa paksa:
    Ang pagtatrabaho sa mga proyekto, pagbuo at pagprograma ng mga website, script, at iba pang mga sistema ay tumatagal ng halos lahat ng aking libreng oras (bukod sa oras ng pagtatrabaho), sa madaling salita, ginagawa ko ang gawaing ito para sa pinakamataas na posibleng bilang ng oras sa isang araw. Paminsan-minsan ay may pangangailangan na subukan ang isang bagay, para sa kasiyahan o pag-usisa lamang. Bilang resulta, ang mga site na ginawa sa pagmamadali, gamit ang mga lutong bahay na makina o CMS ng mga sinaunang bersyon, ay nagiging katulad na pagsubok sa mga daga sa laboratoryo. Siyempre, ang lahat ng nasa itaas ay naghihirap mula sa baluktot na nakasulat na code, kawalan ng kontrol ng data at simpleng puno ng iba't ibang mga bug. Sa totoo lang, sa karamihan ng mga kaso, sa isang oras ng aking mga eksperimento sa mga naturang site, nakakahanap ako ng ilang seryosong kahinaan, at karamihan sa mga ito ay nasa hindi sapat na pagpapatunay ng papasok na data. SA kani-kanina lang Madalas itong matatagpuan sa mga script na nagpoproseso ng data ng POST na nagmumula sa JavaScript + Ajax.

    Tila, ang mga programmer na sumulat ng mga script na ito gamit ang Ajax ay naniniwala na dahil ang lahat ng mga kahilingan ay nangyayari sa background, nang hindi nalalaman ng gumagamit o nang hindi nagre-reload ng pahina, kung gayon ang data ay hindi kailangang partikular na suriin.

    Bilang isang patakaran, medyo marami sa mga script na ito ay naging puno ng mga butas na walang labis na pagsisikap na nagawa nilang gumawa ng isang mas malaking butas at baha ang kanilang shell. siyempre, para lamang sa layunin ng pag-eeksperimento at wala nang iba pa (ang pangangasiwa ng naturang mga site ay palaging may alam tungkol sa mga kasalukuyang kahinaan).

    Sa tingin ko ang kahalagahan ng pagpapatunay ay malinaw sa lahat. Sa loob ng mahabang panahon, isinulat ko ang parehong piraso ng code sa bawat oras, pagkatapos ay ginamit ko ang sarili kong mga function ng pagpapatunay ng data, na marami sa mga ito ay napaka-primitive at kadalasang nakakalat sa kabuuan. iba't ibang bahagi(nakalakip) na mga file. Hindi nagtagal ay nagsimula akong maging pamilyar sa PHP frameworks Zend, CI, Kohana, na ang bawat isa ay nagpatupad ng sarili nitong klase para sa pagpapatunay ng data na hiniram ko para sa aking mga proyekto. Sa huli, nagpasya akong iangkop ang isa sa mga klase ng CI sa aking mga pangangailangan, ngunit ito pala ay ang may-akda ng isa sa mga blog sa programming ang nag-asikaso nito. Susunod, ibinabahagi ko ang kanyang mga gawa, lalo na ang binagong aklatan ng CodeIgniter.

    Tingnan natin ang sumusunod na code:

    Tingnan ang code PHP

    require_once "validator.class.php" ;

    $validator = bagong Validator() ; $validator -> set_rules ("pangalan" , "Ang iyong pangalan" , array ("kinakailangan" => , "alpha" => ) );$validator -> set_rules ("email" , "Your email" , array ("required" => "Field %s is required" , "valid_email" => ) ); if ($validator -> run () ) ( echo "Nagtagumpay ang validation" ; ) else ( echo $validator -> get_string_errors () ; ).
    Tulad ng nakikita mo mula sa halimbawa, sa unang linya kasama namin ang file ng klase validator.calss.php sa aming script. Susunod, lumikha kami ng isang halimbawa ng klase at i-save ang bagay sa isang variable

    $validator

  • Pagkatapos ay ginagamit ang pamamaraan$validator->set_rules($field, $label, $rules)
  • itakda ang mga patlang para sa pagpapatunay. Ang pamamaraang ito ay tumatagal ng 3 mga parameter:
  • $patlang- pangalan ng field ng pagpapatunay (ang halaga ng katangian ng pangalan sa tag)
  • $label - pangalan ng field ng pagpapatunay, ay ilalagay sa mga mensahe ng error$mga panuntunan - isang hanay ng mga panuntunan sa pagpapatunay, kung saan ang panuntunan sa pagpapatunay ay ginagamit bilang susi, at ang mensahe ng error para sa panuntunang ito ay ginagamit bilang ang halaga Matapos maitakda ang lahat ng mga field para sa pagpapatunay, ilulunsad namin ang validator gamit ang pamamaraan $validator->run().

    . Kung matagumpay ang pagpapatunay, ibabalik ng pamamaraang ito ang halaga

  • TOTOO, kung hindi, kung mayroong anumang mga error, babalik ito
  • MALI May tatlong paraan para makatanggap ng mga mensahe ng error:
  • get_string_errors()- ibinabalik ang lahat ng mga mensahe ng error bilang isang string
  • get_array_errors() — ibinabalik ang lahat ng mga mensahe bilang isang array, kung saan ang pangalan ng field ay ginagamit bilang susi, at ang paglalarawan ng error para sa field na ito ay ginagamit bilang ang halaga. form_error($field)- nagbabalik ng mensahe ng error para sa field na ipinasa bilang parameter na $field

    Bilang default, ang mga mensahe ng error ay nakabalot sa isang tag . Upang itakda ang iyong disenyo, gamitin ang pamamaraan set_error_delimiters($prefix, $suffix) . Halimbawa tulad nito:

    Ngayon ang mga mensahe ng error ay magiging

    Tingnan ang code PHP

    div

    may klase "error" Tulad ng nakikita mo, ang lahat ay napaka-simple.

    Tingnan ang code PHP

    $rules = array ( array ( "field" => "pangalan" , "label" => "Iyong pangalan" , "rules" => array ( "kinakailangan" => "Kinakailangan ang field %s" , "alpha" = > "Ang patlang %s ay dapat maglaman lamang ng mga titik" ), array ( "field" => "email" , "label" => "Ang iyong email" , "rules" => array ( "required" => "Field % s is kinakailangan" , "valid_email" => "Ang patlang %s ay dapat maglaman ng wastong email address" ) ) ) ;

    $validator -> set_rules ($rules );

    Tulad ng nakikita mo, isinulat ko ang parehong mga panuntunan sa pagpapatunay tulad ng sa unang halimbawa, sa anyo lamang ng isang multidimensional na associative array. Maaari mong gamitin ang alinman sa mga pamamaraan na pinakaangkop sa iyo sa isang partikular na sitwasyon.

    Kaya, anong mga panuntunan sa pagpapatunay ang sinusuportahan ng klase na ito? Dinala ko sa klase na ito ang pinakakaraniwang panuntunan sa pagpapatunay na nararanasan ng lahat. Dito buong listahan

    mga panuntunang ito:kinakailangan
    Nagbabalik ng FALSE kung walang laman ang fieldinteger
    Nagbabalik ng FALSE kung ang value ay hindi isang integerlumutang
    Nagbabalik ng FALSE kung ang value ay hindi isang numeric na halagavalid_url
    Nagbabalik ng FALSE kung ang value ay hindi wastong URLvalid_email
    Nagbabalik ng FALSE kung ang value ay hindi wastong email addressvalid_ip
    Nagbabalik ng FALSE kung hindi wasto ang IP addressmga posporo
    Nagbabalik ng FALSE kung hindi tumugma ang elemento sa halaga ng isa pang elemento ng fieldalpha
    Nagbabalik ng FALSE kung ang elemento ay naglalaman ng higit pa sa mga titikvalid_captcha
    Nagbabalik ng FALSE kung ang halaga sa field ng session ay hindi katumbas ng halaga ng field ng formvalid_date

    Nagbabalik ng FALSE kung ang elemento ay naglalaman ng di-wastong petsa

    Karamihan sa mga panuntunang ito ay gumagamit ng mga filter, na naging available sa PHP 5.

    Kung nais mo, maaari mong palaging palawakin ang hanay ng mga panuntunan para sa pagpapatunay sa pamamagitan ng pagdaragdag ng mga kinakailangang function sa klase ng Validator.

    Tingnan ang code PHP

    Upang makuha ang naprosesong halaga ng data ng POST, gamitin ang sumusunod na paraan:


    Sa isang nakaraang artikulo nangako akong magsulat ng paghahambing ng sarili kong library sa iba pang magagamit na mga solusyon, kaya titingnan natin ngayon ang pagpapatunay gamit ang Aura.Filter, Respect Validation, Sirius Validation at Valitron.


    Karaniwan ang pamamaraang ito ay tinatawag upang i-clear ang form sa matagumpay na pagproseso ng form.

  • pangalan.
  • Dapat maglaman ng eksaktong dalawang salita, kung saan ang una ay ang pangalan ng gumagamit at ang pangalawa ay ang apelyido.
  • Isipin natin na mayroon tayong partikular na pampublikong serbisyo sa pag-unlad na nangangailangan ng mga user na magparehistro para sa ganap na access sa lahat ng mga function. Kaya, ang registration form ay maglalaman ng mga sumusunod na field:
  • email.
  • Dapat maglaman ng wastong address
  • email


    password.

    Dapat itakda at hindi hihigit sa 64 na character ang haba.

    sumang-ayon.

    Isang karaniwang checkbox na dapat suriin ng isang user upang kumpirmahin ang kanilang pagtanggap sa mga tuntunin ng serbisyo.

  • Kaya, mayroon kaming limang field na dapat punan ng user para makapagrehistro sa aming haka-haka na serbisyo. Isipin natin na nakatanggap kami ng ganap na di-wastong data bilang input:
  • $data = [ "pangalan" => "Albert", // Dapat ay dalawang salitang "login" => "@lbert", // "Bawal" na karakter @ "email" => "may mali", / / ​​Dapat maging isang e-mail na "password" => Aura.Filter
  • Ang pagpapatunay gamit ang Aura.Filter ay nagsisimula sa isang pabrika ng filter. Kailangan nating lumikha ng tinatawag na "filter ng paksa", dahil patunayan natin ang isang array, hindi isang indibidwal na halaga.
  • Tinutukoy namin ang mga panuntunan gamit ang Aura\Filter\FilterFactory; $filter = (bagong FilterFactory)->newSubjectFilter(); $filter->validate("name") ->isNotBlank() ->is("two_words") ->setMessage("Ang pangalan ay dapat dalawang salita."); $filter->validate("login") ->isBlankOr("alnum") ->setMessage("Kung tumukoy ka ng login, dapat ay naglalaman lamang ito ng mga Latin na character."); $filter->validate("email") ->isNotBlank() ->is("email") ->setMessage("Mangyaring magpasok ng wastong email address."); $filter->validate("password") ->isNotBlank() ->is("strlenMax", 64) ->setMessage("Pakisulat ang iyong password."); $filter->validate("agreed") ->is("callback", function($subject, $field) ( return $subject->($field) === true; ))->setMessage("Kailangan mo sumang-ayon sa mga tuntunin ng serbisyo.");
  • email.
  • Marahil ay napansin mo na hindi ko tinukoy ang panuntunan ng two_words. Naturally, walang ganoong panuntunan sa Aura.Filter, kaya kailangan nating gumawa ng isa. Tulad ng sinasabi ng dokumentasyon, ginagawa ito gamit ang isang hiwalay na klase para sa panuntunan:


    /** * Panuntunan na nagpapatunay sa username.

    * Ang username ay binubuo ng dalawang salita: una at apelyido, na pinaghihiwalay ng isang puwang.


    */ class UserNameRule ( /** * Pinapatunayan ang user name. * * @param object|array $subject * @param string $field * @param int $max * * @return bool */ public function __invoke($subject, $ field , $max = null) ($value = $subject->($field); if (! is_scalar($value)) ( return false; ) return (bool) preg_match("/^+\s+$/u" , $value);


    Ang ikalawang hakbang ay ipaalam sa pabrika ng filter ang tungkol sa aming bagong panuntunan. Ginagawa ito sa pamamagitan ng pagpasa ng unang argumento bilang isang hanay ng mga panuntunan sa pabrika ng filter:

    Ang susunod na hakbang ay ipaalam sa Aura.Filter na nakagawa kami ng bagong panuntunan at gusto namin itong gamitin. Ginagawa ito sa pamamagitan ng pagpasa ng hanay ng mga panuntunan sa unang argumento ng pabrika:

    gamitin ang Aura\Filter\FilterFactory; $rules = [ "two_words" => function() ( ibalik ang bagong UserNameRule; ) ]; $filter = (bagong FilterFactory($rules))->newSubjectFilter();

    Ngayon ang aming two_words rule ay maaaring gamitin sa parehong paraan tulad ng anumang iba pang karaniwang tuntunin.


    Feedback


    Tulad ng naaalala mo, ang papasok na data na aming pinapatunayan ay ganap na hindi wasto, dahil ang bawat field ay naglalaman ng isang maling halaga o hindi ito naglalaman ng lahat. Samakatuwid, ipinapalagay na bilang resulta ng pagpapatunay ay makakatanggap kami ng mga error at kaukulang mensahe tungkol sa kanila.

    Pina-validate namin gamit ang Aura.Filter gaya ng sumusunod: $valid = $filter->apply($data); kung (! $valid) ($failures = $filter->getFailures(); $messages = $failures->getMessages(); ) SA


    $mga mensahe

    isang array ang isinusulat, kaya para magpakita ng mga mensahe kailangan namin ng dalawang nested foreach:


    Igalang ang Pagpapatunay


    gamitin ang Respect\Validation\Validator bilang v; $data = [ "pangalan" => "Albert", // Dapat ay dalawang salitang "login" => "@lbert", // "Bawal" na karakter @ "email" => "may mali", / / ​​Dapat maging isang e-mail dito "password" => "" // Ang password ay hindi tinukoy sa lahat // "sumang-ayon" ay wala sa array dahil hindi nilagyan ng tsek ng user ang kahon ];

    Pagtukoy sa mga tuntunin


    Tulad ng sa Aura.Filter, kailangan namin ng sarili naming panuntunan sa pagpapatunay para sa username, kaya magsimula tayo doon:

    namespace MyNamespace; gamitin ang Respect\Validation\Rules\AbstractRule; class UserNameRule extends AbstractRule ( public function validate($input) ( return (bool) preg_match("/^+\s+$/u", $input); ) )


    Ang external rules API ay halos magkapareho sa Aura.Filter, ang validate() method lang ang ginagamit sa halip na __invoke() magic. Para sa akin, ang API na ito, mas simple at mas naiintindihan. Well, mas malapit ito sa Kontrolio :).


    Wala akong nakitang anumang pagbanggit nito sa dokumentasyon, gayunpaman, bilang karagdagan sa panuntunan mismo, kailangan mong lumikha ng iyong sariling uri ng pagbubukod para dito. Ang pangalan ng exception class ay dapat na binubuo ng pangalan ng rule class at isang postfix

    Exception


    gamitin ang Respect\Validation\Exceptions\NestedValidationException; pinapalawak ng class UserNameRuleException ang NestedValidationException ( // )

    Well, sa wakas ma-validate na namin ang aming data. Una, ipinapasa namin ang aming bagong panuntunan sa validator upang malaman niya ang tungkol dito at magamit namin ito sa hinaharap. Sa Respect Validation, ito ay ginagawa sa pamamagitan ng pagtawag sa with() method, na ipinapasa ang namespace kung saan matatagpuan ang mga non-standard na panuntunan. v::with("MyNamespace\\"); Ngayon ang lahat ng hindi karaniwang mga panuntunan ay matatagpuan sa namespace


    MyNamespace

    , ay "makikilala" ng validator. Ang susunod na hakbang ay ilarawan ang mga kinakailangang tuntunin at magsagawa ng pagpapatunay. v::attribute("name", v::userNameRule()) ->attribute("login", v::alnum("-_")) ->attribute("email", v::email()) ->attribute("password", v::notEmpty()->stringType()->length(null, 64)) ->attribute("agreed", v::trueVal()) ->assert((object) $data); Pansinin kung paano namin inilalapat ang aming panuntunan sa katangian


    pangalan . Dito ang pangalan ng klase ng panuntunan ay binago sa pangalan ng pamamaraan ng validator. Ang natitirang mga panuntunan ay, sa pangkalahatan, madaling maunawaan. Ito ay nagkakahalaga ng pagbanggit nang hiwalay kung bakit namin ibinibigay ang array

    gamitin ang Aura\Filter\FilterFactory; $rules = [ "two_words" => function() ( ibalik ang bagong UserNameRule; ) ]; $filter = (bagong FilterFactory($rules))->newSubjectFilter();

    Hindi tulad ng Aura.Filter, ang Respect validator ay naghagis ng exception kapag nabigo ang validation. At ang pagbubukod na ito ay naglalaman ng mga mensahe ng error sa pagpapatunay. Samakatuwid, ang halimbawang ipinakita lamang ay dapat na isulat tulad ng sumusunod:


    subukan ( 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("sumang-ayon", v::trueVal()) ->assert((object) $data ) catch (NestedValidationException $ex) ( $messages = $ex->getMessages(); )

    Gamit ang getMessages() makakakuha tayo ng flat array ng lahat ng mensahe na nakolekta ng validator sa panahon ng proseso ng validation. Sa pamamagitan ng paglalaglag ng array, nakakakuha tayo ng ganito:


    array(5) ( => string(29) “Nabigo ang pagpapatunay ng data para sa %s” => string(60) “ang pag-login ay dapat maglaman lamang ng mga titik (a-z), digit (0–9) at “-_”” => string (25) “dapat wastong email ang email” => string(26) “hindi dapat walang laman ang password” => string(32) “Dapat naroroon ang attribute na napagkasunduan” )

    Maaari mong baguhin ang mga mensahe sa iyong sarili. Marahil ay hindi ko naintindihan ang library na ito, ngunit ang prosesong ito ay tila hindi masyadong halata sa akin: kailangan mong gamitin ang findMessages() na paraan sa isang pinangangasiwaan na pagbubukod, kung saan tinukoy mo ang mga mensahe hindi para sa mga katangian, ngunit para sa mga panuntunan.


    $ex->findMessages([ "userNameRule" => "Ang username ay dapat binubuo ng dalawang salita.", "alnum" => "Hindi namin gusto ang iyong login.", "email" => "Malinaw na ayaw mo gusto mong ibigay sa amin ang iyong e-mail.", "notEmpty" => "Well, nasaan ang iyong password?", "agreed" => "Nakakalungkot na hindi ka sumasang-ayon." ]);

    Hindi ko alam kung ano ang mali, ngunit may ilang mga bagay na hindi ko pa rin maintindihan. Ito ang nakukuha natin sa pamamagitan ng pagtukoy sa mga panuntunan sa paraan sa itaas:


    array(5) ( => string(40) “Dapat na dalawang salita ang username.” => string(31) “Hindi namin gusto ang iyong login.” => string(25) “dapat valid na email ang email” = > string(5) “Well, where is your password?” => string(9) “Sayang na hindi ka pumayag.”

    Tulad ng nakikita mo, ang mensahe para sa field ng email ay hindi inilapat, ang pamantayan ay nanatili. Ngunit ang mensahe sa index 4 ay kabaligtaran! At ito sa kabila ng katotohanan na hindi ko ginamit ang pangalan ng panuntunan, ngunit ang pangalan ng patlang. Samantalang kung ginamit ko ang pangalan ng panuntunan (trueVal), ang aking mensahe ay nawala sa kung saan. Ang mga komento mula sa mga nakaranasang gumagamit ng aklatang ito ay malugod na tinatanggap.

    Pagpapatunay ng Sirius

    Ok, lumipat tayo sa susunod na library at tingnan kung paano nito pinangangasiwaan ang mga katulad na gawain.

    Pagtukoy sa mga tuntunin

    Muli kailangan nating tukuyin ang isang panuntunan para sa username. Isusulat namin ito ng ganito:


    class UserNameRule extends AbstractRule ( // Error Messages const MESSAGE = "Ang username ay dapat dalawang salita."; const LABELED_MESSAGE = "(label) ay dapat dalawang salita."; public function validate($value, $valueIdentifier = null ) ( return (bool) preg_match("/^+\s+$/u", $value);

    Pakitandaan ang pagkakaiba sa mga diskarte kumpara sa mga aklatang natalakay na. Tinutukoy namin ang dalawang uri ng mga mensahe sa mga constant sa halip na gumamit ng mga katangian, pamamaraan o argumento ng panuntunan.


    Ngayon ilarawan natin ang lohika ng pagpapatunay:


    $validator = bagong Validator; $validator ->add("name", "required | MyApp\Validation\Rule\UserNameRule") ->add("login", "required | alphanumhyphen", null, "Ang pag-login ay maaari lamang maglaman ng mga Latin na titik, gitling at salungguhit. ") ->add("email", "required | email", null, "Mangyaring magpasok ng tamang e-mail.") ->add("password", "required | maxlength(64)", null, "Your password, sir.") ->add("agree", "required | equal(true)", null, "Bakit hindi ka pumayag?");

    Tulad ng nakikita mo, ang hanay ng mga patakaran ay napaka-simple at nababasa. Para sa paglalarawan, gumagamit kami ng mga pangalan na pinaghihiwalay ng mga pahalang na bar. Ang diskarte na ito ay katulad ng ginamit sa Laravel at Kontrolio.


    Ang ikaapat na argumento sa paraan ng add() ay naglalarawan ng mensahe ng error sa pagpapatunay na gagamitin ni Sirius kung nabigo ang pagpapatunay. Bakit hindi kami nagdagdag ng mensahe para sa aming bagong panuntunan? UserNameRule?


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

    Ito ay dahil ang mga mensahe ay inilarawan na sa mga constant ng klase:


    class UserNameRule extends AbstractRule ( // Error messages const MESSAGE = "Ang username ay dapat dalawang salita."; ...

    Ang isa pang pagpipilian ay ang paggamit ng addMessage() na paraan ng validator mismo:


    $validator->addMessage("email", "Mangyaring magpasok ng wastong e-mail.");

    Pakitandaan na ang mga custom na panuntunan ay tinutukoy ng buong pangalan ng kanilang klase, habang sa Kontrolio maaari kang tumukoy ng alias/alias.

    gamitin ang Aura\Filter\FilterFactory; $rules = [ "two_words" => function() ( ibalik ang bagong UserNameRule; ) ]; $filter = (bagong FilterFactory($rules))->newSubjectFilter();

    Upang maisagawa ang pagpapatunay, tinatawag namin ang validator method validate() , na ipinapasa ang data dito:


    $data = [ "pangalan" => "Albert", // Dapat ay dalawang salitang "login" => "@lbert", // "Bawal" na karakter @ "email" => "may mali", / / ​​Dapat maging isang e-mail dito "password" => "" // Ang password ay hindi tinukoy sa lahat // "sumang-ayon" ay wala sa array dahil hindi nilagyan ng tsek ng user ang kahon ]; $validator->validate($data);

    Hindi tulad ng Paggalang, si Sirius ay hindi magtapon ng eksepsiyon, ngunit babalik lamang mali. Maaaring makuha ang mga mensahe ng error sa pagpapatunay sa pamamagitan ng getMessages() validator method. Ibinabalik nito ang mga error na naka-grupo ayon sa mga attribute, kaya kailangan namin ng dalawang foreach loops upang dumaan sa mga error:


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

    Narito ang $message ay isang bagay ng klase Sirius\Validation\ErrorMessage, na mayroong getTemplate() method na nagbabalik ng mismong mensaheng kailangan namin.

    Valitron Pagtukoy sa mga patakaran

    Ang unang pagkakaiba: upang magdagdag ng bagong panuntunan, hindi mo kailangang gumawa ng hiwalay na klase. Maaari ka lang gumamit ng pagsasara na nagbabalik ng boolean na resulta.


    Upang magdagdag ng mga custom na panuntunan, ang Valitron ay may static na paraan addRule(), kung saan ang unang dalawang argumento ay kinakailangan, at ang pangatlo ay opsyonal. Nagustuhan ko ang pamamaraang ito, dahil dito nakasaad ang rule identifier, logic at error message sa isang lugar.


    gamitin ang Valitron\Validator; Validator::addRule("two_words", function($field, $value) ( ​​​​return (bool) preg_match("/^+\s+$/u", $value); ), "Ang username ay dapat na eksaktong binubuo ng dalawang salita ");

    Ang pangalawang pagkakaiba ay kung paano inilalapat ang mga panuntunan sa mga katangian. Sa lahat ng nakaraang kaso, nakita namin na ang isang katangian ay, kumbaga, isang pangunahing bagay.


    Ibang ruta ang kinuha ni Valitron at inuna ang mga panuntunan sa pagpapatunay. Sa pamamagitan ng paglalarawan ng mga panuntunan, tila nag-aaplay ka ng mga katangian sa mga panuntunang ito, at hindi kabaliktaran.


    $validator = bagong Validator($data); $validator ->rule("two_words", "name")->label("") ->rule("required", [ "name", "login", "email", "password", "agreed" ] ) ->rule("slug", "login") ->rule("email", "email") ->rule("accepted", "agreed");

    Tulad ng makikita mula sa halimbawa, sa rule() na pamamaraan ay isusulat muna namin ang pangalan ng panuntunan, at pagkatapos ay ipahiwatig ang mga katangian na dapat tumutugma sa panuntunang ito. Ang isang mas tahasang halimbawa ay ang kinakailangang panuntunan, na nagpapakita kung paano "kabilang" ang mga katangian sa panuntunang iyon.


    Ang Valitron (tulad ng iba pang mga solusyon na aming nasuri) ay nagbibigay ng mga karaniwang mensahe ng error. Kung gagamitin mo lang ang mga ito, makikita mo na ang bawat mensahe ay nagsisimula sa pangalan ng kaukulang katangian.


    Pinapalitan ng Valitron ang mga pangalan ng attribute sa text ng mensahe kahit na ginagamit ang mga hindi karaniwang error na mensahe. Iyon ang dahilan kung bakit ginamit namin ang label() na pamamaraan na may walang laman na string upang alisin ang pangalan ng katangian.


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

    Partikular tungkol sa pagpapatunay, ang Valitron library API ay halos hindi naiiba sa kung ano ang nakita na natin sa artikulo. Upang maisagawa ang pagpapatunay, tinatawag namin ang validator method validate() :


    $validator->validate();

    Maaaring makuha ang mga mensahe ng error sa pagpapatunay gamit ang getErrors() method:


    $validator->mga error();

    Ang mga mensahe dito ay pinagsama ayon sa mga katangian sa parehong paraan tulad ng sa Sirius Validation, maliban na walang hiwalay na klase para sa mensahe, at nakakakuha kami ng regular na multi-dimensional na array.


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

    At sa wakas, ang huling aklatan para sa ngayon ay ang sarili kong pag-unlad na tinatawag na Kontrolio.

    Pagtukoy sa mga tuntunin

    Muli, sa ikalimang pagkakataon, gagawa kami ng panuntunan sa pagpapatunay para sa username. Ang lahat ay medyo simple at pamantayan:


    namespace MyProject\Validation\Rules; gumamit ng Kontrolio\Rules\AbstractRule; class TwoWords extends Kontrolio\Rules\AbstractRule ( public function isValid($input = null) ( return (bool) preg_match("/^+\s+$/u", $input); ) )

    Ngayon ay lumikha kami ng isang pabrika at nagrehistro ng isang panuntunan dito gamit ang extend() na paraan:


    namespace MyProject; gumamit ng Kontrolio\Factory; gamitin ang MyProject\Validation\Rules\Twords; $factory = Kontrolio\Factory::getInstance()->extend();

    Pagkatapos irehistro ang panuntunan, magagamit namin ito, kasama ang pangalan - two_words. Gumawa tayo ng validator:


    $data = [ "pangalan" => "Albert", // Dapat ay dalawang salitang "login" => "@lbert", // "Bawal" na karakter @ "email" => "may mali", / / ​​Dapat maging isang e-mail dito "password" => "" // Ang password ay hindi tinukoy sa lahat // "sumang-ayon" ay wala sa array dahil hindi nilagyan ng tsek ng user ang kahon ]; $rules = [ "name" => "two_words", "login" => "minsan|alphadash", "email" => "email", "password" => "length:1.64", "agreed" => " tinanggap" ]; $messages = [ "name" => "Ang username ay dapat binubuo ng dalawang salita.", "login" => "Hindi namin gusto ang iyong login.", "email" => "Malinaw na ayaw mong magbigay us your email .", "password" => "Well, where is your password?", "agreed" => "Nakakalungkot na hindi ka sumasang-ayon." ]; $validator = $factory->make($data, $rules, $messages);

    Inilarawan namin ang mga panuntunan gamit ang isang syntax na katulad ng ginamit sa Laravel, bagama't maaari sana kaming gumamit ng mas verbose na bersyon:


    $rules = [ "pangalan" => bagong TwoWords, "login" => , "email" => bagong Email, "password" => bagong Haba(1, 64), "napagkasunduan" => bagong Tinanggap ];

    Feedback


    $validator->validate();

    Sinimulan ang pagpapatunay gamit ang parehong validate() na pamamaraan:



    Ngayon ay makakakuha tayo ng mga mensahe ng error gamit ang isa sa mga getErrors() o getErrorsList() na mga pamamaraan. Ang unang paraan ay nagbibigay-daan para sa mas kumplikadong output ng error, habang ang pangalawa ay nagbabalik ng isang flat array. Gamit ang getErrors() maaari tayong mag-output ng mga mensahe tulad nito:


    At sa getErrorsList() makakagawa ka ng mas simpleng listahan ng mga mensahe:

    Bottom line

  • Sa artikulong ito nagpakita ako ng mga halimbawa ng paggamit ng mga sumusunod na aklatan:
  • Aura.Filter
  • Pagpapatunay ng Sirius
  • Igalang ang Pagpapatunay
  • Valitron
  • kontrol


    Ang isang "tunay na halimbawa sa mundo" ay maaaring mukhang masyadong simple. Kailangan kong sumang-ayon, dahil, sa katunayan, ang ilang mga kakayahan sa aklatan ay naiwan sa artikulo. Sa prinsipyo, kung interesado ka, maaari mong pag-aralan ang kanilang mga tampok sa iyong sarili.


    Ang bawat isa sa mga aklatan ay nag-aalok ng sarili nitong mga tampok at may mga madilim na panig nito, kaya sa tingin ko ito ay isang bagay ng panlasa at hamon na piliin ang isa.

    Dapat maglaman ng wastong email address.

    • callback.
    • Ang ganitong uri ng panuntunan ay katulad ng mga pagsasara mula sa Kontrolio. Pinapayagan ka nitong tukuyin ang isang panuntunan sa anyo ng pagsasara. Sa pagsasara na ito, ipinapasa ng Aura.Filter ang "paksa", ang aming data array mula sa form, at isang field, sa kasong ito ay sumang-ayon .
    • Mga Tag:
    pagpapatunay ng datos