Үй / Linux шолуы / Тексерілген, расталған... және расталған! РНР-де деректер валидаторларын салыстыру. PHP Insane validation php көмегімен деректерді тексеру және тазалау

Тексерілген, расталған... және расталған! РНР-де деректер валидаторларын салыстыру. PHP Insane validation php көмегімен деректерді тексеру және тазалау

Пішін жіберу деректерін одан әрі өңдеуге алмас бұрын, пішінге енгізілген деректерді растау өте маңызды. Пішінде көптеген өрістер болған кезде, PHP тексеру сценарийі тым күрделі болады. Сонымен қатар, сіз жасаған пішіндердің көпшілігі үшін бірдей немесе ұқсас тексеруді орындап жатқандықтан, пішінді тексеруге қайталанатын күштің тым көп бөлігі жұмсалады.

Осы жалпы PHP пішінін тексеру сценарийі туралы

Бұл жалпы PHP пішінін тексеру сценарийі пішінге тексерулерді қосуды өте жеңілдетеді.

Біз пішіндегі әрбір элементпен «тексеру дескрипторларының» жинағын жасаймыз және байланыстырамыз. «Валидация дескрипторы» - орындалатын тексеру түрін көрсететін жол. Мысалы, «req» қажет дегенді білдіреді, «альфа» тек алфавиттік таңбаларға рұқсат береді және т.б.

Пішіндегі әрбір өрісте нөл, бір немесе бірнеше тексеру болуы мүмкін. Мысалы, кіріс бос болмауы керек, 25 таңбадан аз болуы керек, әріптік-сандық болуы керек және т.б.

Пішіндегі әрбір енгізу өрісі үшін тексеру дескрипторларының жиынын байланыстыруға болады.

PHP пішінін тексеру сценарийін жүктеп алыңыз

Төменде PHP пішінін тексеру сценарийін жүктеп алуға болады:
Zip файлында formvalidator.php пішінді тексеру сценарийі, құжаттама және пайдалану үлгілері бар.

РНР пішінін тексеру сценарийін пайдалану
  • Formvalidator.php файлын пішін өңдеу сценарийіне қосыңыз
  • require_once "formvalidator.php"
  • FormValidator нысанын жасаңыз және пішінді тексеру дескрипторларын қосыңыз.
  • $validator = жаңа FormValidator(); $validator->addValidation("Аты","req","Атын толтырыңыз"); $validator->addValidation("Электрондық пошта","электрондық пошта", "Электрондық пошта үшін енгізу жарамды электрондық пошта мәні болуы керек"); $validator->addValidation("Электрондық пошта", "req", "Электрондық поштаны толтырыңыз");

    Бірінші аргумент пішіндегі енгізу өрісінің атауы болып табылады. Екінші аргумент - талап етілетін тексеру түрін көрсететін тексеру дескрипторы. Үшінші аргумент - тексеру сәтсіз болған жағдайда көрсетілетін қате туралы хабар.

  • ValidateForm() функциясын шақыру арқылы пішінді растаңыз
  • if(!$validator->ValidateForm()) ( echo "Тексеру қателері:"; $error_hash = $validator->GetErrors(); foreach($error_hash as $inpname => $inp_err) ( echo "

    $inpname: $inp_err

    \n"; ) ) Мысал

    Төмендегі мысал идеяны айқынырақ етеді

    Аты: Электрондық пошта:

    Теңшелетін тексеруді қосу

    Тексеру дескрипторлары қамтамасыз етпейтін реттелетін тексеруді қосқыңыз келсе, мұны істеуге болады. Міне қадамдар:

  • Теңшелетін тексеру үшін сынып жасаңыз және DoValidate() функциясын қайта анықтаңыз
  • класс MyValidator CustomValidator кеңейтеді ( DoValidate(&$formars,&$error_hash функциясы) ( if(stristr($formars["Comments"],"http://")) ( $error_hash["Comments"]="URL мекенжайларына рұқсат жоқ түсініктемелерде»; жалған қайтару; ) шын қайтару; ) )

  • Теңшелетін тексеру нысанын қосыңыз
  • $validator = жаңа FormValidator(); $validator->addValidation("Аты","req","Атын толтырыңыз"); $validator->addValidation("Электрондық пошта","электрондық пошта", "Электрондық пошта үшін енгізу жарамды электрондық пошта мәні болуы керек"); $validator->addValidation("Электрондық пошта", "req", "Электрондық поштаны толтырыңыз"); $custom_validator = new MyValidator(); $validator->AddCustomValidator($custom_validator);

    Теңшелетін тексеру функциясы басқа тексерулерден кейін автоматты түрде шақырылады.

    Тексеру дескрипторларының кестесі

    Мұнда барлық тексеру дескрипторларының тізімі берілген:

    Тексеру дескрипторыҚолданылуы
    талапАлаң бос болмауы керек
    maxlen=???енгізілген деректердің максималды ұзындығын тексереді. Мысалы, рұқсат етілген ең үлкен өлшем 25 болса, тексеру дескрипторын «maxlen=25» ретінде беріңіз.
    minlen=???енгізілген жолдың ұзындығын қажетті минимумға дейін тексереді. мысал “minlen=5”
    түлегіДеректердің құрамында әліпбилік немесе сандық таңбалардан басқа кез келген басқа таңбалар болса, тексеріңіз
    соңғы_сандарТек алфавиттік, сандық және бос орын таңбаларына рұқсат береді
    санСандық деректерді тексеру
    альфаАлфавиттік деректерді тексеру.
    альфаларАлфавиттік деректерді тексеріңіз және бос орындарға рұқсат беріңіз.
    электрондық поштаӨріс электрондық пошта өрісі болып табылады және деректердің дұрыстығын тексеріңіз.
    lt=???
    кемі=???
    Деректердің берілген мәннен аз болуын тексеріңіз. Тек сандық өрістер үшін жарамды.
    мысал: егер мән 1000-нан аз болса, валидация сипаттамасын «lt=1000» ретінде беріңіз
    gt=???
    үлкен =???
    Деректердің берілген мәннен үлкен болуын тексеріңіз. Тек сандық өрістер үшін жарамды.
    мысал: егер мән 10-нан үлкен болса, «gt=10» ретінде валидация сипаттамасын беріңіз
    regexp=???Мән тұрақты өрнекке сәйкес болуы керек тұрақты өрнекпен тексеріңіз.
    мысал: “regexp=^(1.20)$” 20 алфавиттік таңбаға дейін рұқсат береді.
    таңдаусыз=??Бұл тексеру дескрипторы таңдаулы енгізу элементтеріне (тізімдерге) арналған. Әдетте таңдау тізім жолақтарында «Біреуін таңдау» деген бір элемент болады. Пайдаланушы осы опциядан басқа опцияны таңдауы керек. Бұл опцияның мәні «Біреуін таңдау» болса, тексеру сипаттамасы «dontselect=Біреуін таңдау» болуы керек.
    dontselectchkБұл тексеру дескрипторы құсбелгілерге арналған. Пайдаланушы берілген құсбелгіні таңдамауы керек. ?? орнына құсбелгінің мәнін көрсетіңіз.
    Мысалы, dontselectchk=on
    shouldselchkБұл тексеру дескрипторы құсбелгілерге арналған. Пайдаланушы берілген құсбелгіні таңдауы керек. ?? орнына құсбелгінің мәнін көрсетіңіз.
    Мысалы, shouldselchk=on
    электр радиосын таңдамаңызБұл тексеру дескрипторы радио түймелеріне арналған. Пайдаланушы берілген радио түймені таңдамауы керек. ?? орнына радио түйменің мәнін көрсетіңіз.
    Мысалы, dontselectradio=NO
    таңдаулы радиоБұл тексеру дескрипторы радио түймелеріне арналған. Пайдаланушы берілген радио түймені таңдауы керек. ?? орнына радио түйменің мәнін көрсетіңіз.
    Мысалы, selectradio=иә
    селмин=??Құсбелгілер тобынан кемінде n құсбелгі санын таңдаңыз.
    Мысалы: selmin=3
    жалғызРадио тобын міндетті етеді. Пайдаланушы радио тобынан кем дегенде бір элементті таңдауы керек.
    eqelmnt=???пішіндегі екі элементті салыстырыңыз және мәндердің бірдей екеніне көз жеткізіңіз Мысалы, «құпия сөз» және «құпия сөзді растау». ауыстырыңыз ??? басқа енгізу элементінің атымен.
    Мысалы: eqelmnt=confirm_pwd

    Алдыңғы мақалада мен өз кітапханамды басқа қолжетімді шешімдермен салыстыруды жазуға уәде бердім, сондықтан бүгін біз Aura.Filter, Respect Validation, Sirius Validation және Valitron көмегімен тексеруді қарастырамыз.


    Бізде пайдаланушыларды тіркеуден тұратын белгілі бір мемлекеттік қызмет бар деп елестетіп көрейік толық қол жеткізубарлық функцияларға. Осылайша, тіркеу формасы келесі өрістерді қамтиды:

  • аты.
  • Дәл екі сөзден тұруы керек, мұнда біріншісі - пайдаланушының аты, екіншісі - тегі.
  • кіру. Егер мән берілсе, онда тек латын әріптері, сызықшалар және астын сызулар болуы керек..
  • электрондық пошта.
  • Жарамды мекенжай болуы керек
  • электрондық пошта


    құпия сөз.

    Орнатылған болуы және ұзындығы 64 таңбадан аспауы керек.

    келісті.

    Пайдаланушы қызмет көрсету шарттарын қабылдағанын растау үшін тексеруі керек әдеттегі құсбелгі.

  • Сонымен, бізде пайдаланушы біздің ойдан шығарылған қызметімізге тіркелу үшін толтыруы керек бес өріс бар. Енгізу ретінде мүлдем жарамсыз деректерді алдық деп елестетейік:
  • $data = [ "name" => "Альберт", // Екі сөз болуы керек "логин" => "@lbert", // "Тыйым салынған" таңба @ "email" => "бірдеңе дұрыс емес", / / ​​Онда болуы керек e-mail "password" => Aura.Filter болыңыз
  • Aura.Filter көмегімен тексеру сүзгі зауытынан басталады. Біз «тақырып сүзгісін» жасауымыз керек, өйткені біз жеке мәнді емес, массивді тексереміз.
  • Aura\Filter\FilterFactory пайдалану ережелерін анықтаймыз; $сүзгі = (жаңа FilterFactory)->newSubjectFilter(); $filter->validate("name") ->isNotBlank() ->is("two_words") ->setMessage("Атау екі сөзден тұруы керек."); $filter->validate("login") ->isBlankOr("alnum") ->setMessage("Егер логинді көрсетсеңіз, онда тек латын таңбалары болуы керек."); $filter->validate("электрондық пошта") ->isNotBlank() ->is("email") ->setMessage("Жарамды электрондық пошта мекенжайын енгізіңіз."); $filter->validate("password") ->isNotBlank() ->is("strlenMax", 64) ->setMessage("Құпия сөзіңізді жазыңыз."); $сүзгі->validate("келісілді") ->is("кері шақыру", функция($тақырып, $өріс) ( қайтару $тақырып->($өріс) === шын; ))->setMessage("Сізге қажет" қызмет көрсету шарттарымен келіседі.»);
  • Көріп отырғаныңыздай, ережелердің сипаттамасы өте қарапайым. Aura.Filter қораптан тыс пайдалы ережелердің толық жиынтығын ұсынады және олардың кейбіреулері жоғарыдағы мысалда қолданылған: isNotBlank әдісі.Өрістің нөлдік мәні болуы мүмкін емес екенін көрсетеді.
  • Екі_сөз ережесін көрсетпегенімді байқаған боларсыз. Әрине, Aura.Filter-де мұндай ереже жоқ, сондықтан біз оны жасауымыз керек. Құжаттамада айтылғандай, бұл ереже үшін бөлек сыныпты пайдалану арқылы жасалады:


    /** * Пайдаланушы атын растайтын ереже.

    * Пайдаланушы аты екі сөзден тұрады: аты мен тегі бір бос орынмен бөлінген.


    */ class UserNameRule ( /** * Пайдаланушы атын тексереді. * * @param нысаны|массив $тақырып * @param жолы $field * @param int $max * * @return bool */ жалпы функция __invoke($subject, $ өріс , $max = null) ( $мән = $тақырып->($өріс); егер (! is_scalar($value)) (қайту жалған; ) қайтару (bool) preg_match("/^+\s+$/u" , $мән);


    Екінші қадам - ​​сүзгі зауытына біздің жаңа ережеміз туралы хабарлау. Ол бірінші аргументті сүзгі зауытына ережелер жиыны ретінде беру арқылы жасалады:

    Келесі қадам - ​​Aura.Filter-ге жаңа ереже жасағанымызды және оны пайдаланғымыз келетінін хабарлау. Бұл зауыттың бірінші аргументіне бірқатар ережелерді беру арқылы жасалады:

    Aura\Filter\FilterFactory пайдаланыңыз; $reges = [ "two_words" => function() (жаңа UserNameRule қайтарады; ) ]; $сүзгі = (жаңа FilterFactory($ ережелер))->newSubjectFilter();

    Енді біздің екі_сөз ережесін кез келген басқа стандартты ереже сияқты қолдануға болады.


    Кері байланыс


    Естеріңізде болса, біз растайтын кіріс деректер толығымен жарамсыз, себебі әрбір өрісте қате мән бар немесе мүлде жоқ. Сондықтан, валидация нәтижесінде қателер мен олар туралы сәйкес хабарламалар аламыз деп болжанады.

    Біз Aura.Filter арқылы келесідей тексереміз: $жарамды = $сүзгі->қолдану($деректер); егер (! $жарамды) ( $failures = $filter->getFailures(); $messages = $failures->getMessages(); ) IN


    $хабарламалар

    массив жазылуда, сондықтан хабарламаларды көрсету үшін бізге екі кірістірілген foreach қажет:


    Валидацияны құрметтеңіз


    Respect\Validation\Validator v ретінде пайдаланыңыз; $data = [ "name" => "Альберт", // Екі сөз болуы керек "логин" => "@lbert", // "Тыйым салынған" таңба @ "email" => "бірдеңе дұрыс емес", / / ​​Онда болуы керек мұнда электрондық пошта болыңыз "password" => "" // Құпия сөз мүлдем көрсетілмеген // "келісілді" массивте жоқ, себебі пайдаланушы құсбелгіні қоймаған ];

    Ережелерді анықтау


    Aura.Filter сияқты, бізге пайдаланушы аты үшін жеке тексеру ережесі қажет, сондықтан сол жерден бастайық:

    аттар кеңістігі MyNamespace; Respect\Validation\Rules\AbstractRule пайдаланыңыз; class UserNameRule AbstractRule кеңейтеді ( жалпы функция validate($input) (қайтару (bool) preg_match("/^+\s+$/u", $input); ) )


    Сыртқы API ережелері Aura.Filter-мен бірдей дерлік, __invoke() сиқырының орнына validate() әдісі ғана пайдаланылады. Маған бұл API қарапайым және түсінікті болып көрінді. Бұл Kontrolio-ға жақынырақ :).


    Мен құжаттамада бұл туралы ешбір ескертуді таппадым, бірақ ереженің өзінен басқа, ол үшін өзіңіздің ерекше жағдай түрін жасауыңыз керек. Ерекшелік сыныбының атауы ереже сыныбының аты мен постфикстен тұруы керек

    Ерекшелік


    Respect\Validation\Exceptions\NestedValidationException пайдаланыңыз; Class UserNameRuleException NestedValidationException кеңейтеді ( // )

    Ақырында біз деректерімізді тексере аламыз. Біріншіден, біз жаңа ережемізді валидаторға береміз, сонда ол бұл туралы біледі және біз оны болашақта пайдалана аламыз. Respect Validation ішінде бұл стандартты емес ережелер орналасқан аттар кеңістігінен өту арқылы with() әдісін шақыру арқылы орындалады. v::with("MyNamespace\\");Енді барлық стандартты емес ережелер аттар кеңістігінде орналасқан


    MyNamespace

    , валидатормен "танылады". Келесі қадам - ​​қажетті ережелерді сипаттау және тексеруді орындау. v::attribute("аты", v::userNameRule()) ->атрибут("логин", v::alnum("-_")) ->атрибут("электрондық пошта", v::email()) ->attribute("password", v::notEmpty()->stringType()->length(null, 64)) ->attribute("келісілген", v::trueVal()) ->assert((объект) $деректер);Ережемізді атрибутқа қалай қолданатынымызға назар аударыңыз


    аты . Мұнда ереже класының атауы валидатор әдісінің атына түрлендірілді. Қалған ережелер, жалпы алғанда, интуитивті.Массивті не үшін беретінімізді бөлек атап өткен жөн

    Aura\Filter\FilterFactory пайдаланыңыз; $reges = [ "two_words" => function() (жаңа UserNameRule қайтарады; ) ]; $сүзгі = (жаңа FilterFactory($ ережелер))->newSubjectFilter();

    Aura.Filter-ден айырмашылығы, Respect валидаторы тексеру сәтсіз болғанда ерекше жағдайды шығарады. Және бұл ерекшелік тексеру қате туралы хабарларды қамтиды. Сондықтан жаңа ғана көрсетілген мысал келесідей жазылуы керек:


    көріңіз ( v::with("RespectValidationExample\\"); v::attribute("аты", v::userNameRule()) ->атрибут("логин", v::alnum("-_")) - >attribute("email", v::email()) ->attribute("password", v::notEmpty()->stringType()->length(null, 64)) ->attribute("келісілген", v::trueVal()) ->assert((object) $data ) catch (NestedValidationException $ex) ( $messages = $ex->getMessages(); )

    getMessages() көмегімен біз валидатор тексеру процесінде жинаған барлық хабарламалардың тегіс массивін аламыз. Массивті демпинг арқылы біз келесідей нәрсені аламыз:


    array(5) ( => string(29) “%s үшін деректерді тексеру сәтсіз аяқталды” => string(60) “логин тек әріптерден (a-z), (0–9) және “-_” сандарынан тұруы керек” => жол (25) "электрондық пошта жарамды электрондық пошта болуы керек" => string(26) "пароль бос болмауы керек" => string(32) "Келісілген төлсипат болуы керек" )

    Хабарламаларды өзіңізге өзгертуге болады. Мүмкін мен бұл кітапхананы қандай да бір түрде дұрыс түсінбеген шығармын, бірақ бұл процесс маған соншалықты айқын көрінбеді: сіз атрибуттар үшін емес, ережелер үшін хабарларды анықтайтын өңделген ерекше жағдайда findMessages() әдісін пайдалануыңыз керек.


    $ex->findMessages([ "userNameRule" => "Пайдаланушы аты екі сөзден тұруы керек.", "alnum" => "Сіздің логиніңіз бізге ұнамайды.", "email" => "Сізге ұнамайтыны анық. бізге электрондық поштаңызды бергіңіз келеді.", "notEmpty" => "Ал, құпия сөзіңіз қайда?", "келісілді" => "Келіспейтініңіз өкінішті." ]);

    Мен не болғанын білмеймін, бірақ мен әлі де түсінбейтін бірнеше нәрсе бар. Ережелерді жоғарыда көрсетілген жолмен анықтау арқылы біз мынаны аламыз:


    array(5) ( => string(40) “Пайдаланушы аты екі сөзден тұруы керек.” => string(31) “Сіздің логиніңіз бізге ұнамайды.” => string(25) “электрондық пошта жарамды электрондық пошта болуы керек” = > string(5) «Ал, сіздің құпия сөзіңіз қайда?» => string(9) «Келіспегеніңіз өкінішті.»

    Көріп отырғаныңыздай, электрондық пошта өрісіне арналған хабарлама қолданылмаған, стандартты қалды. Бірақ 4-ші индекстегі хабарлама керісінше! Және бұл ереженің атауын емес, өріс атауын пайдаланғаныма қарамастан. Егер мен ереже атауын (trueVal) пайдаланған болсам, менің хабарламам бір жерде жоғалып кетер еді. Бұл кітапхананың тәжірибелі пайдаланушыларының пікірлері өте құпталады.

    Сириусты тексеру

    Жарайды, келесі кітапханаға өтіп, оның ұқсас тапсырмаларды қалай орындайтынын көрейік.

    Ережелерді анықтау

    Тағы да біз пайдаланушы аты үшін ережені анықтауымыз керек. Біз оны келесідей жазамыз:


    class UserNameRule AbstractRule кеңейтеді ( // Қате туралы хабарлар const MESSAGE = "Пайдаланушы аты екі сөзден тұруы керек."; const LABELED_MESSAGE = "(белгі) екі сөзден тұруы керек."; жалпы функция validate($value, $valueIdentifier = null ) (қайтару (bool) preg_match("/^+\s+$/u", $value) );

    Жоғарыда талқыланған кітапханалармен салыстырғанда тәсілдердің айырмашылығына назар аударыңыз. Біз сипаттарды, әдістерді немесе ереже аргументтерін пайдаланудан гөрі тұрақты мәндерде хабарлардың екі түрін анықтаймыз.


    Енді валидация логикасын сипаттайық:


    $validator = жаңа Валидатор; $validator ->add("name", "required | MyApp\Validation\Rule\UserNameRule") ->add("логин", "қажетті | alphanumhyphen", null, "Кіру тек латын әріптерін, сызықшаларды және астын сызуларды қамтуы мүмкін. ") ->add("электрондық пошта", "міндетті | электрондық пошта", null, "Дұрыс электрондық поштаны енгізіңіз.") ->add("пароль", "міндетті | maxlength(64)", null, "Сіздің құпия сөз, сэр.") ->add("келісемін", "қажетті | тең(шын)", null, "Неге келіспедің?");

    Көріп отырғаныңыздай, ережелер жиынтығы өте қарапайым және оқылатын. Сипаттама үшін көлденең жолақтармен бөлінген атауларды қолданамыз. Бұл тәсіл Laravel және Kontrolio қолданбаларында қолданылғанға ұқсас.


    add() әдісінің төртінші аргументі валидация сәтсіз болған жағдайда Сириус пайдаланатын тексеру қатесі туралы хабарды сипаттайды. Неліктен біз жаңа ережеге хабар қоспадық? UserNameRule?


    $validator->add("аты", "міндетті | MyApp\Validation\Rule\UserNameRule")

    Себебі бұл хабарламалар сынып тұрақтыларында сипатталған:


    class UserNameRule AbstractRule кеңейтеді ( // Қате туралы хабарлар const MESSAGE = "Пайдаланушы аты екі сөзден тұруы керек."; ...

    Тағы бір нұсқа - валидатордың addMessage() әдісін пайдалану:


    $validator->addMessage("электрондық пошта", "Жарамды электрондық поштаны енгізіңіз.");

    Пайдаланушы ережелері сыныптың толық атымен анықталатынын ескеріңіз, ал Kontrolio қолданбасында бүркеншік атын/бүркеншік атын көрсетуге болады.

    Aura\Filter\FilterFactory пайдаланыңыз; $reges = [ "two_words" => function() (жаңа UserNameRule қайтарады; ) ]; $сүзгі = (жаңа FilterFactory($ ережелер))->newSubjectFilter();

    Валидацияны орындау үшін біз validate() әдісін шақырамыз, оған деректерді жібереміз:


    $data = [ "name" => "Альберт", // Екі сөз болуы керек "логин" => "@lbert", // "Тыйым салынған" таңба @ "email" => "бірдеңе дұрыс емес", / / ​​Онда болуы керек мұнда электрондық пошта болыңыз "password" => "" // Құпия сөз мүлдем көрсетілмеген // "келісілді" массивте жоқ, себебі пайдаланушы құсбелгіні қоймаған ]; $validator->validate($data);

    Құрметтен айырмашылығы, Сириус ерекшелік жасамайды, бірақ жай оралады жалған. Тексеру қатесі туралы хабарларды getMessages() валидатор әдісі арқылы алуға болады. Ол атрибуттар бойынша топтастырылған қателерді қайтарады, сондықтан қателерді өту үшін бізге екі foreach циклі қажет:


    foreach ($validator->getMessages() $атрибут => $хабарламалар) ( foreach ($хабарлама ретінде $хабарлама) ( echo $message->getTemplate() . "\n"; ) )

    Мұнда $message класс нысаны болып табылады Sirius\Validation\ErrorMessage, онда бізге қажетті хабарды қайтаратын getTemplate() әдісі бар.

    Валитрон Ережелерді анықтау

    Бірінші айырмашылық: жаңа ереже қосу үшін бөлек сынып жасаудың қажеті жоқ. Сіз жай ғана логикалық нәтижені қайтаратын жабуды пайдалана аласыз.


    Теңшелетін ережелерді қосу үшін Valitron жүйесінде addRule() статикалық әдісі бар, онда алғашқы екі аргумент қажет, ал үшіншісі міндетті емес. Маған бұл әдіс ұнады, өйткені мұнда ереже идентификаторы, логика және қате туралы хабар бір жерде көрсетілген.


    Valitron\Validator пайдаланыңыз; Validator::addRule("екі_сөз", функция($өріс, $мән) (қайтару (bool) preg_match("/^+\s+$/u", $value); ), "Пайдаланушы аты дәл осыдан тұруы керек. екі сөз «);

    Екінші айырмашылық - ережелердің атрибуттарға қалай қолданылатыны. Бұрынғы барлық жағдайларда біз атрибуттың негізгі нәрсе екенін көрдік.


    Valitron басқа жолды таңдап, валидация ережелерін бірінші орынға қойды. Ережелерді сипаттай отырып, сіз осы ережелерге атрибуттарды қолданып жатқан сияқтысыз, керісінше емес.


    $validator = жаңа Валидатор($деректер); $validator ->ереже("екі_сөз", "аты")->label("") ->ереже("міндетті", [ "аты", "логин", "электрондық пошта", "құпия сөз", "келісілді" ] ) ->reg("slug", "login") ->regle("email", "email") ->regle("қабылдандым", "келісілді");

    Мысалдан көріп отырғанымыздай, rule() әдісінде біз алдымен ереженің атын жазамыз, содан кейін ғана осы ережеге сәйкес келетін атрибуттарды көрсетеміз. Неғұрлым айқын мысал - атрибуттардың осы ережеге қалай "тиісті" екенін көрсететін талап етілетін ереже.


    Valitron (біз қарастырған басқа шешімдер сияқты) стандартты қате туралы хабарларды береді. Егер сіз оларды жай ғана қолдансаңыз, әрбір хабарлама сәйкес атрибуттың атынан басталатынын көресіз.


    Valitron стандартты емес қате туралы хабарлар пайдаланылса да, атрибут атауларын хабарлама мәтініне ауыстырады. Сондықтан атрибут атауын жою үшін label() әдісін бос жолмен қолдандық.


    $validator->ереже("екі_сөз", "аты")->label("") Кері байланыс

    Валидацияға қатысты Valitron кітапханасының API интерфейсі мақалада көргенімізден іс жүзінде еш айырмашылығы жоқ. Валидацияны орындау үшін validate() әдісін шақырамыз:


    $validator->validate();

    Тексеру қатесі туралы хабарларды getErrors() әдісі арқылы алуға болады:


    $validator->қателер();

    Мұндағы хабарлар Sirius Validation жүйесіндегі сияқты атрибуттар бойынша топтастырылған, тек хабарлама үшін жеке класс жоқ және біз кәдімгі көп өлшемді массив аламыз.


    foreach ($validator->қателер() $атрибут => $хабарламалар) ( foreach ($хабарлама ретінде $хабарлама) ( echo $message . "\n"; ) ) Kontrolio

    Ақырында, бүгінгі күннің соңғы кітапханасы - Kontrolio деп аталатын жеке әзірлеме.

    Ережелерді анықтау

    Тағы да, бесінші рет біз пайдаланушы аты үшін тексеру ережесін жасаймыз. Барлығы салыстырмалы түрде қарапайым және стандартты:


    аттар кеңістігі MyProject\Validation\Rules; Kontrolio\Rules\AbstractRule пайдаланыңыз; Class TwoWords Controlio\Rules\AbstractRule (қоғамдық функция isValid($input = null) (қайтару (bool) preg_match("/^+\s+$/u", $input); ) ) кеңейтеді.

    Енді біз зауытты жасаймыз және онда extension() әдісі арқылы ережені тіркейміз:


    MyProject аттар кеңістігі; Kontrolio\Factory пайдаланыңыз; MyProject\Validation\Rules\TwoWords пайдаланыңыз; $factory = Kontrolio\Factory::getInstance()->extend();

    Ережені тіркегеннен кейін біз оны пайдалана аламыз, оның ішінде аты бойынша - two_words. Валидаторды жасайық:


    $data = [ "name" => "Альберт", // Екі сөз болуы керек "логин" => "@lbert", // "Тыйым салынған" таңба @ "email" => "бірдеңе дұрыс емес", / / ​​Онда болуы керек мұнда электрондық пошта болыңыз "password" => "" // Құпия сөз мүлдем көрсетілмеген // "келісілді" массивте жоқ, себебі пайдаланушы құсбелгіні қоймаған ]; $reges = [ "аты" => "екі_сөз", "логин" => "кейде|альфадаш", "электрондық пошта" => "электрондық пошта", "құпия сөз" => "ұзындығы: 1,64", "келісілді" = > " қабылданды» ]; $messages = [ "name" => "Пайдаланушы аты екі сөзден тұруы керек.", "логин" => "Бізге сіздің логиніңіз ұнамайды.", "email" => "Сіз бергіңіз келмейтіні анық. бізге сіздің электрондық поштаңыз .", "password" => "Ал, құпия сөзіңіз қайда?", "келісілді" => "Келіспегеніңіз өкінішті." ]; $validator = $factory->жасау($деректер, $ережелер, $хабарламалар);

    Біз ережелерді Ларавелдегіге ұқсас синтаксисті қолданып сипаттадық, дегенмен біз егжей-тегжейлі нұсқаны пайдалана алар едік:


    $rules = [ "name" => new TwoWords, "логин" => , "email" => жаңа Электрондық пошта, "password" => жаңа Ұзындық(1, 64), "келісілді" => жаңа Қабылданды ];

    Кері байланыс


    $validator->validate();

    Тексеру бірдей validate() әдісі арқылы басталады:



    Енді қате туралы хабарларды getErrors() немесе getErrorsList() әдістерінің бірі арқылы алуға болады. Бірінші әдіс күрделі қатені шығаруға мүмкіндік береді, ал екіншісі тегіс массивді қайтарады. getErrors() көмегімен біз келесідей хабарламаларды шығара аламыз:


    Ал getErrorsList() көмегімен сіз хабарламалардың қарапайым тізімін жасай аласыз:

    Төменгі сызық

  • Бұл мақалада мен келесі кітапханаларды пайдалану мысалдарын көрсеттім:
  • Аура.Сүзгі
  • Сириусты тексеру
  • Валидацияны құрметтеңіз
  • Валитрон
  • бақылау


    «Нақты әлем үлгісі» тым қарапайым болып көрінуі мүмкін. Мен келісуім керек, өйткені, шын мәнінде, кейбір кітапхана мүмкіндіктері мақаладан тыс қалды. Негізінде, егер сізді қызықтырса, олардың ерекшеліктерін өзіңіз зерттей аласыз.


    Кітапханалардың әрқайсысы өз ерекшеліктерін ұсынады және оның қараңғы жақтары бар, сондықтан біреуін таңдау талғам мен қиындыққа байланысты деп ойлаймын.

    Оқығаныңыз үшін рахмет. Дұрыс таңдау жасаңыз.

    Тегтер: тегтерді қосу

    Қайырлы кеш баршаңызға (түн сияқты - редактордың ескертпесі). Бүгін біз оны аздап жақсартамыз. Алдымен, PHP-де пішінді тексеруді және кейбір қауіпсіздік манипуляцияларын жасауды үйренейік.

    Сонымен, төмендегі кодты қарап шығыңыз және келесі өзгерістерге және өзгерістердің келесі себептеріне назар аударыңыз. Мен барлық жаңа жолдарды түспен бөлектедім.

    Пішін өрістерінің атауы өзгертілді. Сіз сұрай аласыз - бұл бізге не үшін керек? Бұл қарапайым, мен сізге жауап беремін. Менің білуімше, кейбір спам-боттар пішіндерді іздейтін сайттарды тексереді және оларды осы өрістердің атаулары негізінде толтырады. Теориялық тұрғыдан, егер олар сәйкестік таппаса, олар үйге кетеді, бұл біз қалайтын нәрсе. Әрине, мен бұл қорғаныс дәрежесі өте жақсы деп ойламаймын, бірақ ол бізге зиян тигізбейді және спам хаттары 1 әріпке азайса, бұл жақсы болады =). Электрондық пошта мекенжайының дұрыс енгізілгенін тексеру. 17-жолда elseif операторы пайдаланылады, ол бізге оң жауап қайтарылған жағдайда тексеріледі, яғни электрондық пошта мекенжайы мүлде жоқ, яғни ол енгізілмеді. Мұнда енгізілген мекенжайды салыстыруға мүмкіндік беретін preg_match функциясын қолданамызтұрақты өрнек . Мүмкін мен тұрақты тіркестер туралы кейінірек қысқаша жазатын шығармын, бірақ әзірге мұны білу керекжолымыз тексерілетін үлгіні жасайды. Ал егер біздің жағдайда енгізілген мекенжай өрнекке сәйкес келмесе, қайтадан қате көрсетіледі. Мысалы, тағы бірнеше тұрақты өрнектер:
    |^[-а-яе\s\.,;:\?!]+$|i– бұл тұрақты өрнек тек орыс алфавитін және бос орын, нүкте, үтір және т.б. сияқты кейбір таңбаларды пайдалануға мүмкіндік береді.
    #http://[-a-z0-9_.]+[-a-z0-9_:@&?=+,.!/~*’%$]*\.(html?|php)#i– және бұл өрнек Интернетте мекенжайдың дұрыс жазылуын тексеруге мүмкіндік береді.

    Әрі қарай, біз басқа операторды қолданамыз, мұнда хат жіберуге арналған барлық кодымыз жіберіліп қойған. Тексеру ережелерін өзіңіз кез келген мөлшерде жасай аласыз, жаңаларын қосыңыз, мысалы, электрондық пошта мекенжайын тексеру үшін, және сіз бақытты боласыз.




    Байланыс жасайтын тұлға:



    Байланыс электрондық поштасы:



    Хабарлама:






    Осылайша сіз PHP пішіндерін басқа ештеңеге жүгінбей тексере аласыз. Келесі жолы пішіндер тақырыбына арналған постта, менің ойымша, jQuery-де пішіндерді тексеру қарастырылады. Әзірше пікірлеріңіз бен тілектеріңізді күтемін. Қайырлы түн және қайырлы таң баршаңызға =).

    Біз POST немесе GET деректерін тексеру туралы айтатын боламыз, бірақ бұл негізінен cookie файлдары сияқты басқа әдістермен алынған деректерге де қолданылуы мүмкін. Кез келген веб-қосымшаны әзірлеу кезінде пайдаланушылармен өзара әрекеттесу үшін интерфейс жазу керек және пайдаланушыларға деректерді серверге жіберу үшін табиғи түрде әртүрлі пішіндерді жасау керек. мысалы, бұл пікірлер болуы мүмкін. Менің ойымша, алынған деректер түрге, өлшемге және көрсетілген диапазонға сәйкес келетінін тексеру үшін тексерілуі керек екені барлығына түсінікті және түсінікті. Ең алдымен, бұл жүйенің, веб-сайттың немесе дерекқордың қауіпсіздігі үшін қажет, себебі... Қате жіберілген деректер немесе әдейі нашар жасалған сұрау шабуылдаушыға қолжетімділікті ашуы мүмкін.

    Екіншіден, тексерілмеген деректер, егер қате болса, сценарийдің, жүйенің немесе бүкіл сервердің тұрақсыз жұмысын тудыруы мүмкін. Сондықтан, барлық деректерді тексеру және екі рет тексеру қажет, мүмкін, біреу артық паранойияның қажеті жоқ деп айтуы мүмкін, бірақ мен бұл мәселеде шамадан тыс болуы мүмкін емес деп ойлаймын;

    Пайдаланушылардан алынған деректерге ешқандай сылтаумен, ешбір жағдайда сенбеңіз. Алынған деректерді тағы бір рет тексеретін кодты жазуға тым жалқау болып қаламыз немесе солай деп үміттенеміз бар әдістертексеру жеткілікті, соның нәтижесінде біз өзімізге жеңілдік жасаймыз.

    Тақырыптан аздап ауытқу:
    Жобалармен жұмыс істеу, веб-сайттарды, сценарийлерді және басқа жүйелерді әзірлеу және бағдарламалау менің бос уақытымның барлығын дерлік алады (жұмыс уақытынан басқа), басқаша айтқанда, мен бұл жұмысты күніне максималды мүмкін болатын сағаттар үшін жасаймын. Уақыт өте келе бір нәрсені сынау керек, көңіл көтеру немесе жай ғана қызығушылық. Нәтижесінде, қолдан жасалған қозғалтқыштарды немесе ежелгі нұсқалардың CMS көмегімен асығыс жасалған сайттар ұқсас сынақ зертханалық егеуқұйрықтарға айналады. Әрине, жоғарыда аталғандардың барлығы қисық жазылған кодтан, деректерді бақылаудың жоқтығынан зардап шегеді және әртүрлі қателерге толы. Шындығында, көп жағдайда, осындай сайттардағы бір сағаттық тәжірибемде мен бірнеше маңызды осалдықтарды таба аламын, олардың көпшілігі кіріс деректердің жеткіліксіз расталуында жатыр. IN соңғы уақыттаБұл JavaScript + Ajax арқылы келетін POST деректерін өңдейтін сценарийлерде жиі кездеседі.

    Бұл сценарийлерді Ajax көмегімен жазған бағдарламашылар барлық сұраулар фондық режимде, пайдаланушының хабарынсыз немесе жай ғана бетті қайта жүктемей орындалатындықтан, деректерді ерекше тексерудің қажеті жоқ деп санайды.

    Әдетте, бұл сценарийлердің біразы саңылауларға толы болып шығады, олар көп күш жұмсамай-ақ үлкенірек тесік жасап, қабығын толтырады. әрине, тек эксперимент мақсатында және басқа ештеңе емес (мұндай сайттардың әкімшілігі әрқашан бар осалдықтар туралы хабардар болады).

    Менің ойымша, валидацияның маңыздылығы барлығына түсінікті. Ұзақ уақыт бойы мен әр жолы бірдей код бөлігін жаздым, содан кейін өзімнің деректерді тексеру функцияларын қолдандым, олардың көпшілігі өте қарапайым және әдетте бүкіл әлемде шашыраңқы болды. әртүрлі бөліктер(қоса берілген) файлдар. Көп ұзамай мен Zend, CI, Kohana PHP фреймворктерімен таныса бастадым, олардың әрқайсысы өз жобаларым үшін қарызға алған деректерді тексеру үшін өз класын енгізді. Соңында мен CI сыныптарының бірін өз қажеттіліктеріме сәйкес келтіруді шештім, бірақ бағдарламалау блогтарының бірінің авторы бұл мәселемен айналысқан екен. Содан кейін мен оның жұмыстарымен, атап айтқанда өзгертілген CodeIgniter кітапханасымен бөлісемін.

    Келесі кодты қарастырайық:

    Кодты қарау PHP

    require_once "validator.class.php" ;

    $validator = new Validator(); $validator -> set_rules («аты» , «Сіздің атыңыз» , массив («міндетті» => , «альфа» => ) );$validator -> set_rules ("электрондық пошта" , "Сіздің электрондық поштаңыз" , массив ("талап" => "%s өрісі қажет" , "valid_email" => ) ); if ($validator -> іске қосу () ) ( echo "Тексеру сәтті өтті"; ) else ( echo $validator -> get_string_errors () ; ).
    Мысалдан көріп отырғаныңыздай, бірінші жолға класс файлын қосамыз validator.calss.phpбіздің сценарийге. Содан кейін біз класс данасын жасаймыз және нысанды айнымалыға сақтаймыз

    $validator

  • Содан кейін әдісті қолданыңыз$validator->set_reges($field, $label, $reges)
  • тексеру үшін өрістерді орнатыңыз.Бұл әдіс 3 параметрді қабылдайды:
  • $өріс- валидация өрісінің атауы (тегтегі атау атрибутының мәні)
  • $белгі - тексеру өрісінің атауы, қате туралы хабарларға енгізіледі$ережелер - валидация ережелерінің жиыны, онда валидация ережесі кілт ретінде пайдаланылады және осы ереже үшін қате туралы хабар мән ретінде пайдаланылады.Валидацияға арналған барлық өрістер орнатылғаннан кейін әдіс арқылы валидаторды іске қосамыз $validator->run().

    . Тексеру сәтті болса, бұл әдіс мәнді қайтарады

  • ШЫН, әйтпесе, қателер болса, ол қайтарылады
  • ЖАЛҒАНҚате туралы хабарларды алудың үш әдісі бар:
  • get_string_errors()- барлық қате туралы хабарларды жол ретінде қайтарады
  • get_array_errors() — барлық хабарламаларды массив ретінде қайтарады, мұнда өріс атауы кілт ретінде пайдаланылады, ал мән ретінде осы өрістің қате сипаттамасы пайдаланылады. пішін_қатесі($өріс)- $field параметрі ретінде берілген өріс үшін қате туралы хабарды қайтарады

    Әдепкі бойынша, қате туралы хабарлар тегке оралады . Дизайнды орнату үшін әдісті пайдаланыңыз set_error_delimiters($префикс, $суффикс) . Мысалы, келесідей:

    Енді қате туралы хабарлар айналады

    Кодты қарау PHP

    див

    сыныппен "қате"Көріп отырғаныңыздай, бәрі өте қарапайым.

    Кодты қарау PHP

    $reges = массив ( массив ( "өріс" => "аты" , "белгі" => "Сіздің атыңыз" , "ережелер" => массив ( "міндетті" => "%s өрісі қажет" , "альфа" = > "%s өрісінде тек әріптер болуы керек" ), массив ( "өріс" => "электрондық пошта" , "label" => "Сіздің электрондық поштаңыз" , "ережелер" => массив ( "талап етілген" => "% s өрісі қажет" , "valid_email" => "%s өрісінде жарамды электрондық пошта мекенжайы болуы керек" ) ) ;

    $validator -> set_reges ($reges );

    Көріп отырғаныңыздай, мен бірінші мысалдағыдай валидация ережелерін ғана көпөлшемді ассоциативті массив түрінде жаздым. Сіз белгілі бір жағдайда өзіңізге қолайлы әдістердің кез келгенін пайдалана аласыз.

    Сонымен, бұл сынып қандай тексеру ережелерін қолдайды? Мен осы сыныпқа барлығы кездесетін ең көп тараған валидация ережелерін келтірдім. Мұндатолық тізім

    бұл ережелер:қажет
    Өріс бос болса, FALSE мәнін қайтарадыбүтін сан
    Мән бүтін сан болмаса, FALSE мәнін қайтарадыжүзу
    Мән сандық мән болмаса, FALSE мәнін қайтарадыvalid_url
    Мән жарамды URL мекенжайы болмаса, FALSE мәнін қайтарадыvalid_email
    Мән жарамды электрондық пошта мекенжайы болмаса, FALSE мәнін қайтарадыvalid_ip
    IP мекенжайы жарамсыз болса, FALSE мәнін қайтарадысәйкес келеді
    Элемент басқа өріс элементінің мәніне сәйкес келмесе, FALSE мәнін қайтарадыальфа
    Элемент тек әріптерден көп болса, FALSE мәнін қайтарадыvalid_captcha
    Сеанс өрісіндегі мән пішін өрісінің мәніне тең болмаса, FALSE мәнін қайтарадыжарамды_күн

    Элементте жарамсыз күн болса, FALSE мәнін қайтарады

    Бұл ережелердің көпшілігі PHP 5-те қол жетімді болған сүзгілерді пайдаланады.

    Қаласаңыз, Validator сыныбына қажетті функцияларды қосу арқылы валидация ережелер жинағын әрқашан кеңейте аласыз.

    Кодты қарау PHP

    Өңделген POST деректерінің мәнін алу үшін келесі әдісті пайдаланыңыз:


    Алдыңғы мақалада мен өз кітапханамды басқа қолжетімді шешімдермен салыстыруды жазуға уәде бердім, сондықтан бүгін біз Aura.Filter, Respect Validation, Sirius Validation және Valitron көмегімен тексеруді қарастырамыз.


    Әдетте бұл әдіс пішінді сәтті өңдеуден кейін пішінді тазалау үшін шақырылады.

  • аты.
  • Дәл екі сөзден тұруы керек, мұнда біріншісі - пайдаланушының аты, екіншісі - тегі.
  • Бізде әзірлеуде белгілі бір мемлекеттік қызмет бар деп елестетіп көрейік, ол пайдаланушылардан барлық функцияларға толық қол жеткізу үшін тіркелуді талап етеді. Осылайша, тіркеу формасы келесі өрістерді қамтиды:
  • электрондық пошта.
  • Жарамды мекенжай болуы керек
  • электрондық пошта


    құпия сөз.

    Орнатылған болуы және ұзындығы 64 таңбадан аспауы керек.

    келісті.

    Пайдаланушы қызмет көрсету шарттарын қабылдағанын растау үшін тексеруі керек әдеттегі құсбелгі.

  • Сонымен, бізде пайдаланушы біздің ойдан шығарылған қызметімізге тіркелу үшін толтыруы керек бес өріс бар. Енгізу ретінде мүлдем жарамсыз деректерді алдық деп елестетейік:
  • $data = [ "name" => "Альберт", // Екі сөз болуы керек "логин" => "@lbert", // "Тыйым салынған" таңба @ "email" => "бірдеңе дұрыс емес", / / ​​Онда болуы керек e-mail "password" => Aura.Filter болыңыз
  • Aura.Filter көмегімен тексеру сүзгі зауытынан басталады. Біз «тақырып сүзгісін» жасауымыз керек, өйткені біз жеке мәнді емес, массивді тексереміз.
  • Aura\Filter\FilterFactory пайдалану ережелерін анықтаймыз; $сүзгі = (жаңа FilterFactory)->newSubjectFilter(); $filter->validate("name") ->isNotBlank() ->is("two_words") ->setMessage("Атау екі сөзден тұруы керек."); $filter->validate("login") ->isBlankOr("alnum") ->setMessage("Егер логинді көрсетсеңіз, онда тек латын таңбалары болуы керек."); $filter->validate("электрондық пошта") ->isNotBlank() ->is("email") ->setMessage("Жарамды электрондық пошта мекенжайын енгізіңіз."); $filter->validate("password") ->isNotBlank() ->is("strlenMax", 64) ->setMessage("Құпия сөзіңізді жазыңыз."); $сүзгі->validate("келісілді") ->is("кері шақыру", функция($тақырып, $өріс) ( қайтару $тақырып->($өріс) === шын; ))->setMessage("Сізге қажет" қызмет көрсету шарттарымен келіседі.»);
  • электрондық пошта.
  • Екі_сөз ережесін көрсетпегенімді байқаған боларсыз. Әрине, Aura.Filter-де мұндай ереже жоқ, сондықтан біз оны жасауымыз керек. Құжаттамада айтылғандай, бұл ереже үшін бөлек сыныпты пайдалану арқылы жасалады:


    /** * Пайдаланушы атын растайтын ереже.

    * Пайдаланушы аты екі сөзден тұрады: аты мен тегі бір бос орынмен бөлінген.


    */ class UserNameRule ( /** * Пайдаланушы атын тексереді. * * @param нысаны|массив $тақырып * @param жолы $field * @param int $max * * @return bool */ жалпы функция __invoke($subject, $ өріс , $max = null) ( $мән = $тақырып->($өріс); егер (! is_scalar($value)) (қайту жалған; ) қайтару (bool) preg_match("/^+\s+$/u" , $мән);


    Екінші қадам - ​​сүзгі зауытына біздің жаңа ережеміз туралы хабарлау. Ол бірінші аргументті сүзгі зауытына ережелер жиыны ретінде беру арқылы жасалады:

    Келесі қадам - ​​Aura.Filter-ге жаңа ереже жасағанымызды және оны пайдаланғымыз келетінін хабарлау. Бұл зауыттың бірінші аргументіне бірқатар ережелерді беру арқылы жасалады:

    Aura\Filter\FilterFactory пайдаланыңыз; $reges = [ "two_words" => function() (жаңа UserNameRule қайтарады; ) ]; $сүзгі = (жаңа FilterFactory($ ережелер))->newSubjectFilter();

    Енді біздің екі_сөз ережесін кез келген басқа стандартты ереже сияқты қолдануға болады.


    Кері байланыс


    Естеріңізде болса, біз растайтын кіріс деректер толығымен жарамсыз, себебі әрбір өрісте қате мән бар немесе мүлде жоқ. Сондықтан, валидация нәтижесінде қателер мен олар туралы сәйкес хабарламалар аламыз деп болжанады.

    Біз Aura.Filter арқылы келесідей тексереміз: $жарамды = $сүзгі->қолдану($деректер); егер (! $жарамды) ( $failures = $filter->getFailures(); $messages = $failures->getMessages(); ) IN


    $хабарламалар

    массив жазылуда, сондықтан хабарламаларды көрсету үшін бізге екі кірістірілген foreach қажет:


    Валидацияны құрметтеңіз


    Respect\Validation\Validator v ретінде пайдаланыңыз; $data = [ "name" => "Альберт", // Екі сөз болуы керек "логин" => "@lbert", // "Тыйым салынған" таңба @ "email" => "бірдеңе дұрыс емес", / / ​​Онда болуы керек мұнда электрондық пошта болыңыз "password" => "" // Құпия сөз мүлдем көрсетілмеген // "келісілді" массивте жоқ, себебі пайдаланушы құсбелгіні қоймаған ];

    Ережелерді анықтау


    Aura.Filter сияқты, бізге пайдаланушы аты үшін жеке тексеру ережесі қажет, сондықтан сол жерден бастайық:

    аттар кеңістігі MyNamespace; Respect\Validation\Rules\AbstractRule пайдаланыңыз; class UserNameRule AbstractRule кеңейтеді ( жалпы функция validate($input) (қайтару (bool) preg_match("/^+\s+$/u", $input); ) )


    Сыртқы API ережелері Aura.Filter-мен бірдей дерлік, __invoke() сиқырының орнына validate() әдісі ғана пайдаланылады. Маған бұл API қарапайым және түсінікті болып көрінді. Бұл Kontrolio-ға жақынырақ :).


    Мен құжаттамада бұл туралы ешбір ескертуді таппадым, бірақ ереженің өзінен басқа, ол үшін өзіңіздің ерекше жағдай түрін жасауыңыз керек. Ерекшелік сыныбының атауы ереже сыныбының аты мен постфикстен тұруы керек

    Ерекшелік


    Respect\Validation\Exceptions\NestedValidationException пайдаланыңыз; Class UserNameRuleException NestedValidationException кеңейтеді ( // )

    Ақырында біз деректерімізді тексере аламыз. Біріншіден, біз жаңа ережемізді валидаторға береміз, сонда ол бұл туралы біледі және біз оны болашақта пайдалана аламыз. Respect Validation ішінде бұл стандартты емес ережелер орналасқан аттар кеңістігінен өту арқылы with() әдісін шақыру арқылы орындалады. v::with("MyNamespace\\");Енді барлық стандартты емес ережелер аттар кеңістігінде орналасқан


    MyNamespace

    , валидатормен "танылады". Келесі қадам - ​​қажетті ережелерді сипаттау және тексеруді орындау. v::attribute("аты", v::userNameRule()) ->атрибут("логин", v::alnum("-_")) ->атрибут("электрондық пошта", v::email()) ->attribute("password", v::notEmpty()->stringType()->length(null, 64)) ->attribute("келісілген", v::trueVal()) ->assert((объект) $деректер);Ережемізді атрибутқа қалай қолданатынымызға назар аударыңыз


    аты . Мұнда ереже класының атауы валидатор әдісінің атына түрлендірілді. Қалған ережелер, жалпы алғанда, интуитивті.Массивті не үшін беретінімізді бөлек атап өткен жөн

    Aura\Filter\FilterFactory пайдаланыңыз; $reges = [ "two_words" => function() (жаңа UserNameRule қайтарады; ) ]; $сүзгі = (жаңа FilterFactory($ ережелер))->newSubjectFilter();

    Aura.Filter-ден айырмашылығы, Respect валидаторы тексеру сәтсіз болғанда ерекше жағдайды шығарады. Және бұл ерекшелік тексеру қате туралы хабарларды қамтиды. Сондықтан жаңа ғана көрсетілген мысал келесідей жазылуы керек:


    көріңіз ( v::with("RespectValidationExample\\"); v::attribute("аты", v::userNameRule()) ->атрибут("логин", v::alnum("-_")) - >attribute("email", v::email()) ->attribute("password", v::notEmpty()->stringType()->length(null, 64)) ->attribute("келісілген", v::trueVal()) ->assert((object) $data ) catch (NestedValidationException $ex) ( $messages = $ex->getMessages(); )

    getMessages() көмегімен біз валидатор тексеру процесінде жинаған барлық хабарламалардың тегіс массивін аламыз. Массивті демпинг арқылы біз келесідей нәрсені аламыз:


    array(5) ( => string(29) “%s үшін деректерді тексеру сәтсіз аяқталды” => string(60) “логин тек әріптерден (a-z), (0–9) және “-_” сандарынан тұруы керек” => жол (25) "электрондық пошта жарамды электрондық пошта болуы керек" => string(26) "пароль бос болмауы керек" => string(32) "Келісілген төлсипат болуы керек" )

    Хабарламаларды өзіңізге өзгертуге болады. Мүмкін мен бұл кітапхананы қандай да бір түрде дұрыс түсінбеген шығармын, бірақ бұл процесс маған соншалықты айқын көрінбеді: сіз атрибуттар үшін емес, ережелер үшін хабарларды анықтайтын өңделген ерекше жағдайда findMessages() әдісін пайдалануыңыз керек.


    $ex->findMessages([ "userNameRule" => "Пайдаланушы аты екі сөзден тұруы керек.", "alnum" => "Сіздің логиніңіз бізге ұнамайды.", "email" => "Сізге ұнамайтыны анық. бізге электрондық поштаңызды бергіңіз келеді.", "notEmpty" => "Ал, құпия сөзіңіз қайда?", "келісілді" => "Келіспейтініңіз өкінішті." ]);

    Мен не болғанын білмеймін, бірақ мен әлі де түсінбейтін бірнеше нәрсе бар. Ережелерді жоғарыда көрсетілген жолмен анықтау арқылы біз мынаны аламыз:


    array(5) ( => string(40) “Пайдаланушы аты екі сөзден тұруы керек.” => string(31) “Сіздің логиніңіз бізге ұнамайды.” => string(25) “электрондық пошта жарамды электрондық пошта болуы керек” = > string(5) «Ал, сіздің құпия сөзіңіз қайда?» => string(9) «Келіспегеніңіз өкінішті.»

    Көріп отырғаныңыздай, электрондық пошта өрісіне арналған хабарлама қолданылмаған, стандартты қалды. Бірақ 4-ші индекстегі хабарлама керісінше! Және бұл ереженің атауын емес, өріс атауын пайдаланғаныма қарамастан. Егер мен ереже атауын (trueVal) пайдаланған болсам, менің хабарламам бір жерде жоғалып кетер еді. Бұл кітапхананың тәжірибелі пайдаланушыларының пікірлері өте құпталады.

    Сириусты тексеру

    Жарайды, келесі кітапханаға өтіп, оның ұқсас тапсырмаларды қалай орындайтынын көрейік.

    Ережелерді анықтау

    Тағы да біз пайдаланушы аты үшін ережені анықтауымыз керек. Біз оны келесідей жазамыз:


    class UserNameRule AbstractRule кеңейтеді ( // Қате туралы хабарлар const MESSAGE = "Пайдаланушы аты екі сөзден тұруы керек."; const LABELED_MESSAGE = "(белгі) екі сөзден тұруы керек."; жалпы функция validate($value, $valueIdentifier = null ) (қайтару (bool) preg_match("/^+\s+$/u", $value) );

    Жоғарыда талқыланған кітапханалармен салыстырғанда тәсілдердің айырмашылығына назар аударыңыз. Біз сипаттарды, әдістерді немесе ереже аргументтерін пайдаланудан гөрі тұрақты мәндерде хабарлардың екі түрін анықтаймыз.


    Енді валидация логикасын сипаттайық:


    $validator = жаңа Валидатор; $validator ->add("name", "required | MyApp\Validation\Rule\UserNameRule") ->add("логин", "қажетті | alphanumhyphen", null, "Кіру тек латын әріптерін, сызықшаларды және астын сызуларды қамтуы мүмкін. ") ->add("электрондық пошта", "міндетті | электрондық пошта", null, "Дұрыс электрондық поштаны енгізіңіз.") ->add("пароль", "міндетті | maxlength(64)", null, "Сіздің құпия сөз, сэр.") ->add("келісемін", "қажетті | тең(шын)", null, "Неге келіспедің?");

    Көріп отырғаныңыздай, ережелер жиынтығы өте қарапайым және оқылатын. Сипаттама үшін көлденең жолақтармен бөлінген атауларды қолданамыз. Бұл тәсіл Laravel және Kontrolio қолданбаларында қолданылғанға ұқсас.


    add() әдісінің төртінші аргументі валидация сәтсіз болған жағдайда Сириус пайдаланатын тексеру қатесі туралы хабарды сипаттайды. Неліктен біз жаңа ережеге хабар қоспадық? UserNameRule?


    $validator->add("аты", "міндетті | MyApp\Validation\Rule\UserNameRule")

    Себебі бұл хабарламалар сынып тұрақтыларында сипатталған:


    class UserNameRule AbstractRule кеңейтеді ( // Қате туралы хабарлар const MESSAGE = "Пайдаланушы аты екі сөзден тұруы керек."; ...

    Тағы бір нұсқа - валидатордың addMessage() әдісін пайдалану:


    $validator->addMessage("электрондық пошта", "Жарамды электрондық поштаны енгізіңіз.");

    Пайдаланушы ережелері сыныптың толық атымен анықталатынын ескеріңіз, ал Kontrolio қолданбасында бүркеншік атын/бүркеншік атын көрсетуге болады.

    Aura\Filter\FilterFactory пайдаланыңыз; $reges = [ "two_words" => function() (жаңа UserNameRule қайтарады; ) ]; $сүзгі = (жаңа FilterFactory($ ережелер))->newSubjectFilter();

    Валидацияны орындау үшін біз validate() әдісін шақырамыз, оған деректерді жібереміз:


    $data = [ "name" => "Альберт", // Екі сөз болуы керек "логин" => "@lbert", // "Тыйым салынған" таңба @ "email" => "бірдеңе дұрыс емес", / / ​​Онда болуы керек мұнда электрондық пошта болыңыз "password" => "" // Құпия сөз мүлдем көрсетілмеген // "келісілді" массивте жоқ, себебі пайдаланушы құсбелгіні қоймаған ]; $validator->validate($data);

    Құрметтен айырмашылығы, Сириус ерекшелік жасамайды, бірақ жай оралады жалған. Тексеру қатесі туралы хабарларды getMessages() валидатор әдісі арқылы алуға болады. Ол атрибуттар бойынша топтастырылған қателерді қайтарады, сондықтан қателерді өту үшін бізге екі foreach циклі қажет:


    foreach ($validator->getMessages() $атрибут => $хабарламалар) ( foreach ($хабарлама ретінде $хабарлама) ( echo $message->getTemplate() . "\n"; ) )

    Мұнда $message класс нысаны болып табылады Sirius\Validation\ErrorMessage, онда бізге қажетті хабарды қайтаратын getTemplate() әдісі бар.

    Валитрон Ережелерді анықтау

    Бірінші айырмашылық: жаңа ереже қосу үшін бөлек сынып жасаудың қажеті жоқ. Сіз жай ғана логикалық нәтижені қайтаратын жабуды пайдалана аласыз.


    Теңшелетін ережелерді қосу үшін Valitron жүйесінде addRule() статикалық әдісі бар, онда алғашқы екі аргумент қажет, ал үшіншісі міндетті емес. Маған бұл әдіс ұнады, өйткені мұнда ереже идентификаторы, логика және қате туралы хабар бір жерде көрсетілген.


    Valitron\Validator пайдаланыңыз; Validator::addRule("екі_сөз", функция($өріс, $мән) (қайтару (bool) preg_match("/^+\s+$/u", $value); ), "Пайдаланушы аты дәл осыдан тұруы керек. екі сөз «);

    Екінші айырмашылық - ережелердің атрибуттарға қалай қолданылатыны. Бұрынғы барлық жағдайларда біз атрибуттың негізгі нәрсе екенін көрдік.


    Valitron басқа жолды таңдап, валидация ережелерін бірінші орынға қойды. Ережелерді сипаттай отырып, сіз осы ережелерге атрибуттарды қолданып жатқан сияқтысыз, керісінше емес.


    $validator = жаңа Валидатор($деректер); $validator ->ереже("екі_сөз", "аты")->label("") ->ереже("міндетті", [ "аты", "логин", "электрондық пошта", "құпия сөз", "келісілді" ] ) ->reg("slug", "login") ->regle("email", "email") ->regle("қабылдандым", "келісілді");

    Мысалдан көріп отырғанымыздай, rule() әдісінде біз алдымен ереженің атын жазамыз, содан кейін ғана осы ережеге сәйкес келетін атрибуттарды көрсетеміз. Неғұрлым айқын мысал - атрибуттардың осы ережеге қалай "тиісті" екенін көрсететін талап етілетін ереже.


    Valitron (біз қарастырған басқа шешімдер сияқты) стандартты қате туралы хабарларды береді. Егер сіз оларды жай ғана қолдансаңыз, әрбір хабарлама сәйкес атрибуттың атынан басталатынын көресіз.


    Valitron стандартты емес қате туралы хабарлар пайдаланылса да, атрибут атауларын хабарлама мәтініне ауыстырады. Сондықтан атрибут атауын жою үшін label() әдісін бос жолмен қолдандық.


    $validator->ереже("екі_сөз", "аты")->label("") Кері байланыс

    Валидацияға қатысты Valitron кітапханасының API интерфейсі мақалада көргенімізден іс жүзінде еш айырмашылығы жоқ. Валидацияны орындау үшін validate() әдісін шақырамыз:


    $validator->validate();

    Тексеру қатесі туралы хабарларды getErrors() әдісі арқылы алуға болады:


    $validator->қателер();

    Мұндағы хабарлар Sirius Validation жүйесіндегі сияқты атрибуттар бойынша топтастырылған, тек хабарлама үшін жеке класс жоқ және біз кәдімгі көп өлшемді массив аламыз.


    foreach ($validator->қателер() $атрибут => $хабарламалар) ( foreach ($хабарлама ретінде $хабарлама) ( echo $message . "\n"; ) ) Kontrolio

    Ақырында, бүгінгі күннің соңғы кітапханасы - Kontrolio деп аталатын жеке әзірлеме.

    Ережелерді анықтау

    Тағы да, бесінші рет біз пайдаланушы аты үшін тексеру ережесін жасаймыз. Барлығы салыстырмалы түрде қарапайым және стандартты:


    аттар кеңістігі MyProject\Validation\Rules; Kontrolio\Rules\AbstractRule пайдаланыңыз; Class TwoWords Controlio\Rules\AbstractRule (қоғамдық функция isValid($input = null) (қайтару (bool) preg_match("/^+\s+$/u", $input); ) ) кеңейтеді.

    Енді біз зауытты жасаймыз және онда extension() әдісі арқылы ережені тіркейміз:


    MyProject аттар кеңістігі; Kontrolio\Factory пайдаланыңыз; MyProject\Validation\Rules\TwoWords пайдаланыңыз; $factory = Kontrolio\Factory::getInstance()->extend();

    Ережені тіркегеннен кейін біз оны пайдалана аламыз, оның ішінде аты бойынша - two_words. Валидаторды жасайық:


    $data = [ "name" => "Альберт", // Екі сөз болуы керек "логин" => "@lbert", // "Тыйым салынған" таңба @ "email" => "бірдеңе дұрыс емес", / / ​​Онда болуы керек мұнда электрондық пошта болыңыз "password" => "" // Құпия сөз мүлдем көрсетілмеген // "келісілді" массивте жоқ, себебі пайдаланушы құсбелгіні қоймаған ]; $reges = [ "аты" => "екі_сөз", "логин" => "кейде|альфадаш", "электрондық пошта" => "электрондық пошта", "құпия сөз" => "ұзындығы: 1,64", "келісілді" = > " қабылданды» ]; $messages = [ "name" => "Пайдаланушы аты екі сөзден тұруы керек.", "логин" => "Бізге сіздің логиніңіз ұнамайды.", "email" => "Сіз бергіңіз келмейтіні анық. бізге сіздің электрондық поштаңыз .", "password" => "Ал, құпия сөзіңіз қайда?", "келісілді" => "Келіспегеніңіз өкінішті." ]; $validator = $factory->жасау($деректер, $ережелер, $хабарламалар);

    Біз ережелерді Ларавелдегіге ұқсас синтаксисті қолданып сипаттадық, дегенмен біз егжей-тегжейлі нұсқаны пайдалана алар едік:


    $rules = [ "name" => new TwoWords, "логин" => , "email" => жаңа Электрондық пошта, "password" => жаңа Ұзындық(1, 64), "келісілді" => жаңа Қабылданды ];

    Кері байланыс


    $validator->validate();

    Тексеру бірдей validate() әдісі арқылы басталады:



    Енді қате туралы хабарларды getErrors() немесе getErrorsList() әдістерінің бірі арқылы алуға болады. Бірінші әдіс күрделі қатені шығаруға мүмкіндік береді, ал екіншісі тегіс массивді қайтарады. getErrors() көмегімен біз келесідей хабарламаларды шығара аламыз:


    Ал getErrorsList() көмегімен сіз хабарламалардың қарапайым тізімін жасай аласыз:

    Төменгі сызық

  • Бұл мақалада мен келесі кітапханаларды пайдалану мысалдарын көрсеттім:
  • Аура.Сүзгі
  • Сириусты тексеру
  • Валидацияны құрметтеңіз
  • Валитрон
  • бақылау


    «Нақты әлем үлгісі» тым қарапайым болып көрінуі мүмкін. Мен келісуім керек, өйткені, шын мәнінде, кейбір кітапхана мүмкіндіктері мақаладан тыс қалды. Негізінде, егер сізді қызықтырса, олардың ерекшеліктерін өзіңіз зерттей аласыз.


    Кітапханалардың әрқайсысы өз ерекшеліктерін ұсынады және оның қараңғы жақтары бар, сондықтан біреуін таңдау талғам мен қиындыққа байланысты деп ойлаймын.

    Жарамды электрондық пошта мекенжайы болуы керек.

    • кері қоңырау шалу.
    • Ереженің бұл түрі Kontrolio-дан жабылуларға ұқсас. Ол ережені жабу түрінде анықтауға мүмкіндік береді. Бұл жабу үшін Aura.Filter «тақырыпты», пішіннен біздің деректер массивін және өрісті жібереді, бұл жағдайда келісілді .
    • Тегтер:
    деректерді тексеру