नवीनतम लेख
घर / लिनक्स सिंहावलोकन / मान्य, मान्य... और मान्य! PHP में डेटा सत्यापनकर्ताओं की तुलना करना। PHP Insane सत्यापन php का उपयोग करके सत्यापन और डेटा की सफाई

मान्य, मान्य... और मान्य! PHP में डेटा सत्यापनकर्ताओं की तुलना करना। PHP Insane सत्यापन php का उपयोग करके सत्यापन और डेटा की सफाई

आगे की प्रक्रिया के लिए फॉर्म सबमिशन डेटा लेने से पहले आपके फॉर्म में इनपुट को सत्यापित करना बहुत आवश्यक है। जब फॉर्म में कई फ़ील्ड होते हैं, तो PHP सत्यापन स्क्रिप्ट बहुत जटिल हो जाती है। इसके अलावा, चूंकि आप अपने द्वारा बनाए गए अधिकांश फॉर्मों के लिए समान या समान सत्यापन कर रहे हैं, इसलिए फॉर्म सत्यापन पर बहुत अधिक डुप्लिकेट प्रयास खर्च किए जाते हैं।

इस सामान्य PHP फॉर्म सत्यापन स्क्रिप्ट के बारे में

यह सामान्य PHP फॉर्म सत्यापनकर्ता स्क्रिप्ट आपके फॉर्म में सत्यापन जोड़ना बहुत आसान बनाती है।

हम फॉर्म में प्रत्येक तत्व के साथ "सत्यापन विवरणकों" का एक सेट बनाते और जोड़ते हैं। "सत्यापन विवरणक" एक स्ट्रिंग है जो निष्पादित किए जाने वाले सत्यापन के प्रकार को निर्दिष्ट करता है। उदाहरण के लिए, "req" का अर्थ है आवश्यक, "अल्फा" का अर्थ है केवल वर्णमाला वर्णों की अनुमति देना इत्यादि।

प्रपत्र में प्रत्येक फ़ील्ड में शून्य, एक या अधिक सत्यापन हो सकते हैं। उदाहरण के लिए, इनपुट खाली नहीं होना चाहिए, 25 वर्णों से कम होना चाहिए, अल्फा-न्यूमेरिक होना चाहिए, आदि

आप प्रपत्र में प्रत्येक इनपुट फ़ील्ड के लिए सत्यापन विवरणकों का एक सेट संबद्ध कर सकते हैं।

PHP फॉर्म सत्यापन स्क्रिप्ट डाउनलोड करें

आप नीचे PHP फॉर्म सत्यापन स्क्रिप्ट डाउनलोड कर सकते हैं:
ज़िप फ़ाइल में प्रपत्र सत्यापन स्क्रिप्ट formvalidator.php, दस्तावेज़ीकरण और उपयोग के नमूने शामिल हैं।

PHP फॉर्म सत्यापन स्क्रिप्ट का उपयोग करना
  • अपनी फॉर्म प्रोसेसिंग स्क्रिप्ट में formvalidator.php शामिल करें
  • आवश्यकता_एक बार "formvalidator.php"
  • एक फॉर्मवैलिडेटर ऑब्जेक्ट बनाएं और फॉर्म सत्यापन डिस्क्रिप्टर जोड़ें।
  • $सत्यापनकर्ता = नया फॉर्म सत्यापनकर्ता(); $validator->addValidation('नाम','अनुरोध','कृपया नाम भरें'); $validator->addValidation("ईमेल","ईमेल", "ईमेल के लिए इनपुट एक वैध ईमेल मान होना चाहिए"); $validator->addValidation("ईमेल","अनुरोध","कृपया ईमेल भरें");

    पहला तर्क प्रपत्र में इनपुट फ़ील्ड का नाम है। दूसरा तर्क सत्यापन वर्णनकर्ता है जो आवश्यक सत्यापन के प्रकार को बताता है। तीसरा तर्क सत्यापन विफल होने पर प्रदर्शित होने वाला त्रुटि संदेश है।

  • ValidateForm() फ़ंक्शन को कॉल करके फ़ॉर्म को सत्यापित करें
  • if(!$validator->ValidateForm()) ( echo "Validation Errors:"; $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->addValidation('नाम','अनुरोध','कृपया नाम भरें'); $validator->addValidation("ईमेल","ईमेल", "ईमेल के लिए इनपुट एक वैध ईमेल मान होना चाहिए"); $validator->addValidation("ईमेल","अनुरोध","कृपया ईमेल भरें"); $custom_validator = नया MyValidator(); $सत्यापनकर्ता->AddCustomValidator($custom_validator);

    अन्य सत्यापनों के बाद कस्टम सत्यापन फ़ंक्शन स्वचालित रूप से कॉल किया जाएगा।

    सत्यापन वर्णनकर्ताओं की तालिका

    यहां सभी सत्यापन वर्णनकर्ताओं की सूची दी गई है:

    सत्यापन वर्णनकर्ताप्रयोग
    अनुरोधमैदान खाली नहीं होना चाहिए
    मैक्सलेन=???दर्ज किए गए डेटा की अधिकतम लंबाई की जाँच करता है। उदाहरण के लिए, यदि अनुमत अधिकतम आकार 25 है, तो सत्यापन विवरणक को "मैक्सलेन=25" के रूप में दें।
    मिनलेन=???दर्ज की गई स्ट्रिंग की लंबाई को आवश्यक न्यूनतम तक जांचता है। उदाहरण "मिनलेन=5"
    alnumडेटा की जाँच करें कि क्या उसमें वर्णमाला या संख्यात्मक वर्णों के अलावा कोई अन्य वर्ण हैं
    alnum_sकेवल वर्णमाला, संख्यात्मक और अंतरिक्ष वर्णों की अनुमति देता है
    संख्यासंख्यात्मक डेटा की जाँच करें
    अल्फावर्णमाला संबंधी डेटा की जाँच करें.
    अल्फ़ा_एसवर्णमाला डेटा की जाँच करें और रिक्त स्थान की अनुमति दें।
    ईमेलफ़ील्ड एक ईमेल फ़ील्ड है और डेटा की वैधता को सत्यापित करता है।
    लेफ्टिनेंट=???
    कम=???
    सत्यापित करें कि डेटा पारित मूल्य से कम है। केवल संख्यात्मक फ़ील्ड के लिए मान्य.
    उदाहरण: यदि मान 1000 से कम होना चाहिए तो सत्यापन विवरण "lt=1000" के रूप में दें
    gt=???
    इससे भी बड़ा=???
    सत्यापित करें कि डेटा पारित मूल्य से अधिक है। केवल संख्यात्मक फ़ील्ड के लिए मान्य.
    उदाहरण: यदि मान 10 से अधिक होना चाहिए तो सत्यापन विवरण "gt=10" के रूप में दें
    रेगएक्सपी=???रेगुलर एक्सप्रेशन से जांचें कि मान रेगुलर एक्सप्रेशन से मेल खाना चाहिए।
    उदाहरण: "regexp=^(1.20)$" अधिकतम 20 वर्णमाला वर्णों की अनुमति देता है।
    चयन न करें=??यह सत्यापन विवरणक चुनिंदा इनपुट आइटम (सूचियों) के लिए है। आम तौर पर, चयन सूची बॉक्स में एक आइटम होगा जिसमें लिखा होगा 'एक का चयन करें'। उपयोगकर्ता को इस विकल्प के अलावा कोई अन्य विकल्प चुनना चाहिए। यदि इस विकल्प का मान 'Select One' है, तो सत्यापन विवरण "dontselect=Select One" होना चाहिए।
    Dontselectchkयह सत्यापन विवरणक चेक बॉक्स के लिए है। उपयोगकर्ता को दिए गए चेक बॉक्स का चयन नहीं करना चाहिए. ?? के स्थान पर चेक बॉक्स का मान प्रदान करें
    उदाहरण के लिए, dontselectchk=on
    canselchkयह सत्यापन विवरणक चेक बॉक्स के लिए है। उपयोगकर्ता को दिए गए चेक बॉक्स का चयन करना चाहिए। ?? के स्थान पर चेक बॉक्स का मान प्रदान करें
    उदाहरण के लिए, canselchk=on
    रेडियो का चयन न करेंयह सत्यापन विवरणक रेडियो बटन के लिए है। उपयोगकर्ता को दिए गए रेडियो बटन का चयन नहीं करना चाहिए. ?? के स्थान पर रेडियो बटन का मान प्रदान करें
    उदाहरण के लिए, dontselectradio=NO
    रेडियो चुनेंयह सत्यापन विवरणक रेडियो बटन के लिए है। उपयोगकर्ता को दिए गए रेडियो बटन का चयन करना चाहिए। ?? के स्थान पर रेडियो बटन का मान प्रदान करें
    उदाहरण के लिए, सेलेक्टरेडियो = हाँ
    सेल्मिन=??चेक बॉक्स समूह से कम से कम n संख्या में चेक बॉक्स चुनें।
    उदाहरण के लिए: सेल्मिन=3
    अकेलाएक रेडियो समूह अनिवार्य बनाता है। उपयोगकर्ता को रेडियो समूह से कम से कम एक आइटम का चयन करना चाहिए।
    eqelmnt=???फॉर्म में दो तत्वों की तुलना करें और सुनिश्चित करें कि मान समान हैं उदाहरण के लिए, 'पासवर्ड' और 'पासवर्ड की पुष्टि करें'। प्रतिस्थापित करें ??? अन्य इनपुट तत्व के नाम के साथ।
    उदाहरण के लिए: eqelmnt=confirm_pwd

    पिछले लेख में मैंने अन्य उपलब्ध समाधानों के साथ अपनी लाइब्रेरी की तुलना लिखने का वादा किया था, इसलिए आज हम Aura.Filter, Respect Validation, Sirius Validation और Valitron का उपयोग करके सत्यापन को देखेंगे।


    आइए कल्पना करें कि हमारे पास विकास में एक निश्चित सार्वजनिक सेवा है जिसमें उपयोगकर्ताओं को पंजीकृत करना शामिल है पूर्ण पहुँचसभी कार्यों के लिए. इस प्रकार, पंजीकरण फॉर्म में निम्नलिखित फ़ील्ड होंगे:

  • नाम।
  • इसमें बिल्कुल दो शब्द होने चाहिए, पहला उपयोगकर्ता का पहला नाम और दूसरा अंतिम नाम।
  • लॉग इन करें। यदि कोई मान पारित किया जाता है, तो इसमें केवल लैटिन अक्षर, हाइफ़न और अंडरस्कोर शामिल होने चाहिए।.
  • ईमेल।
  • एक वैध पता होना चाहिए
  • ईमेल


    पासवर्ड।

    सेट होना चाहिए और 64 अक्षरों से अधिक लंबा नहीं होना चाहिए।

    मान गया।

    एक विशिष्ट चेकबॉक्स जिसे उपयोगकर्ता को सेवा की शर्तों की स्वीकृति की पुष्टि करने के लिए जांचना होगा।

  • इसलिए, हमारे पास पांच फ़ील्ड हैं जिन्हें हमारी काल्पनिक सेवा के साथ पंजीकरण करने के लिए उपयोगकर्ता को भरना होगा। आइए कल्पना करें कि हमें इनपुट के रूप में पूरी तरह से अमान्य डेटा प्राप्त हुआ:
  • $डेटा = [ "नाम" => "अल्बर्ट", // दो शब्द होने चाहिए "लॉगिन" => "@lbert", // "निषिद्ध" वर्ण @ "ईमेल" => "कुछ गलत", // होना चाहिए एक ई-मेल "पासवर्ड" => Aura.Filter बनें
  • Aura.Filter का उपयोग करके सत्यापन एक फ़िल्टर फ़ैक्टरी से शुरू होता है। हमें एक तथाकथित "विषय फ़िल्टर" बनाने की आवश्यकता है, क्योंकि हम एक सरणी को मान्य करेंगे, न कि किसी व्यक्तिगत मान को।
  • हम नियमों को परिभाषित करते हैं Aura\Filter\FilterFactory; $फ़िल्टर = (नया फ़िल्टरफ़ैक्टरी)->नयाविषयफ़िल्टर(); $filter->validate("name") ->isNotBlank() ->is("two_words") ->setMessage("नाम दो शब्दों का होना चाहिए।"); $filter->validate("login") ->isBlankOr("alnum") ->setMessage("यदि आप एक लॉगिन निर्दिष्ट करते हैं, तो इसमें केवल लैटिन अक्षर होने चाहिए।"); $filter->validate("email") ->isNotBlank() ->is("email") ->setMessage("कृपया एक वैध ईमेल पता दर्ज करें।"); $filter->validate("password") ->isNotBlank() ->is("strlenMax", 64) ->setMessage("कृपया अपना पासवर्ड लिखें।"); $फ़िल्टर->मान्य करें("सहमत") ->है("कॉलबैक", फ़ंक्शन($विषय, $फ़ील्ड) (वापसी $विषय->($फ़ील्ड) === सत्य; ))->सेटमैसेज("आपको चाहिए सेवा की शर्तों से सहमत हूँ");
  • जैसा कि आप देख सकते हैं, नियमों का विवरण काफी सरल है। Aura.Filter बॉक्स से बाहर उपयोगी नियमों का एक पूरा सेट प्रदान करता है और उनमें से कुछ का उपयोग उपरोक्त उदाहरण में किया गया था: isNotBlank विधि. निर्दिष्ट करता है कि फ़ील्ड का मान शून्य नहीं हो सकता। alnum. यह नियम केवल लैटिन अक्षरों की अनुमति देता है।
  • आपने शायद देखा होगा कि मैंने दो_शब्द नियम निर्दिष्ट नहीं किया है। स्वाभाविक रूप से, Aura.Filter में ऐसा कोई नियम नहीं है, इसलिए हमें एक बनाने की आवश्यकता है। जैसा कि दस्तावेज़ में कहा गया है, यह नियम के लिए एक अलग वर्ग का उपयोग करके किया जाता है:


    /** * नियम जो उपयोगकर्ता नाम को मान्य करता है। * उपयोगकर्ता नाम में दो शब्द होते हैं: पहला और अंतिम नाम, एक स्थान से अलग। */ क्लास यूजरनेमरूल (/** * यूजरनेम को मान्य करता है। * * @param ऑब्जेक्ट|array $subject * @param string $field * @param int $max * * @return bool */ public function __invoke($subject, $field , $अधिकतम = शून्य) ($मान = $विषय->($फ़ील्ड); यदि (! is_scaler($मूल्य)) ( गलत वापसी; ) वापसी (बूल) preg_match("/^+\s+$/u", $मूल्य);

    दूसरा चरण फ़िल्टर फ़ैक्टरी को हमारे नए नियम के बारे में बताना है। यह फ़िल्टर फ़ैक्टरी के नियमों की एक श्रृंखला के रूप में पहला तर्क पारित करके किया जाता है:


    अगला कदम Aura.Filter को सूचित करना है कि हमने एक नया नियम बनाया है और इसका उपयोग करना चाहते हैं। यह फ़ैक्टरी के पहले तर्क में नियमों की एक श्रृंखला पारित करके किया जाता है:


    Aura\Filter\FilterFactory का उपयोग करें; $rules = ["two_words" => function() (नया UserNameRule लौटाएँ; ) ]; $फ़िल्टर = (नया फ़िल्टरफ़ैक्टरी($नियम))->नयाविषयफ़िल्टर();

    अब हमारे दो_शब्द नियम का उपयोग किसी अन्य मानक नियम की तरह ही किया जा सकता है।

    प्रतिक्रिया

    जैसा कि आपको याद है, आने वाला डेटा जिसे हम सत्यापित करते हैं वह पूरी तरह से अमान्य है, क्योंकि प्रत्येक फ़ील्ड में गलत मान होता है या इसमें बिल्कुल भी शामिल नहीं होता है। इसलिए, यह माना जाता है कि सत्यापन के परिणामस्वरूप हमें त्रुटियां और उनके बारे में संबंधित संदेश प्राप्त होंगे।


    हम Aura.Filter के साथ निम्नानुसार सत्यापन करते हैं:


    $मान्य = $फ़िल्टर->लागू करें($डेटा); यदि (! $ मान्य) ($ विफलताएं = $ फ़िल्टर-> getFairures(); $ संदेश = $ विफलताएं-> getMessages(); )

    में $संदेशएक सरणी लिखी जा रही है, इसलिए संदेश प्रदर्शित करने के लिए हमें दो नेस्टेड फ़ोरैच की आवश्यकता है:


    मान्यता का सम्मान करें

    तुलना में मैंने जिस दूसरी लाइब्रेरी का उपयोग किया वह एक अपेक्षाकृत लोकप्रिय समाधान है जिसे रेस्पेक्ट वैलिडेशन कहा जाता है। चूँकि लोग उस पर भरोसा करते हैं, मुझे लगता है कि वहाँ देखने लायक कुछ है।


    प्रयोग की शुद्धता के लिए, पुस्तकालयों की तुलना करते समय, हम शुरुआत में परिभाषित समान डेटा सेट का उपयोग करेंगे:


    Respect\Validation\Validator को v के रूप में उपयोग करें; $डेटा = [ "नाम" => "अल्बर्ट", // दो शब्द होने चाहिए "लॉगिन" => "@lbert", // "निषिद्ध" वर्ण @ "ईमेल" => "कुछ गलत", // होना चाहिए यहां एक ई-मेल भेजें "पासवर्ड" => "" // पासवर्ड बिल्कुल निर्दिष्ट नहीं है // "सहमत" सरणी में नहीं है क्योंकि उपयोगकर्ता ने बॉक्स को चेक नहीं किया है]; नियमों को परिभाषित करना

    Aura.Filter की तरह, हमें उपयोगकर्ता नाम के लिए अपने स्वयं के सत्यापन नियम की आवश्यकता है, तो चलिए वहीं से शुरू करते हैं:


    नेमस्पेस मायनेमस्पेस; Respect\Validation\Rules\AbstractRule का उपयोग करें; वर्ग उपयोगकर्ता नाम नियम सार नियम का विस्तार करता है (सार्वजनिक फ़ंक्शन सत्यापन ($ इनपुट) (वापसी (बूल) preg_match ("/^+\s+$/u", $input); ))

    बाहरी नियम एपीआई लगभग Aura.Filter के समान है, __invoke() जादू के बजाय केवल मान्य() विधि का उपयोग किया जाता है। मुझे ऐसा लगा, यह एपीआई, सरल और अधिक समझने योग्य है। खैर, यह कॉन्ट्रोलियो के करीब है :)


    मुझे दस्तावेज़ में इसका कोई उल्लेख नहीं मिला, हालाँकि, नियम के अलावा, आपको इसके लिए अपना स्वयं का अपवाद प्रकार बनाना होगा। अपवाद वर्ग के नाम में नियम वर्ग का नाम और एक पोस्टफिक्स शामिल होना चाहिए अपवाद.


    Respect\Validation\Exceptions\NestedValidationException का उपयोग करें; वर्ग UserNameRuleException NestedValidationException का विस्तार करता है ( // )

    खैर, अंततः हम अपने डेटा को सत्यापित कर सकते हैं। सबसे पहले, हम अपना नया नियम सत्यापनकर्ता को देते हैं ताकि उसे इसके बारे में पता चले और हम भविष्य में इसका उपयोग कर सकें। रेस्पेक्ट वैलिडेशन में, यह with() विधि को कॉल करके, उस नेमस्पेस को पास करके किया जाता है जिसमें गैर-मानक नियम स्थित हैं।


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

    अब सभी गैर-मानक नियम नामस्थान में स्थित हैं मेरा नामस्थान, सत्यापनकर्ता द्वारा "मान्यता प्राप्त" की जाएगी। अगला कदम आवश्यक नियमों का वर्णन करना और सत्यापन करना है।


    v::विशेषता("नाम", v::userNameRule()) ->विशेषता("लॉगिन", v::alnum("-_")) ->विशेषता("ईमेल", v::ईमेल()) ->विशेषता("पासवर्ड", v::notEmpty()->stringType()->लंबाई(शून्य, 64)) ->विशेषता("सहमत", v::trueVal()) ->assert((ऑब्जेक्ट) $डेटा);

    ध्यान दें कि हम अपने नियम को विशेषता पर कैसे लागू करते हैं नाम. यहां नियम वर्ग का नाम सत्यापनकर्ता विधि के नाम में बदल दिया गया है। बाकी नियम सामान्यतः सहज ज्ञान युक्त हैं।


    यह अलग से उल्लेख करने लायक है कि हम सरणी क्यों प्रदान करते हैं $डेटावस्तु को. तथ्य यह है कि रेस्पेक्ट वैलिडेशन इनपुट के रूप में ऑब्जेक्ट को स्वीकार करता है, सरणियों को नहीं। इस लाइब्रेरी का उपयोग करते हुए विकास करते समय इसे ध्यान में रखा जाना चाहिए।

    प्रतिक्रिया

    Aura.Filter के विपरीत, सत्यापन विफल होने पर Respect सत्यापनकर्ता एक अपवाद फेंकता है। और इस अपवाद में सत्यापन त्रुटि संदेश शामिल हैं। इसलिए, जो उदाहरण अभी दिखाया गया था उसे इस प्रकार लिखा जाना चाहिए:


    प्रयास करें ( v::with("RespectValidationExample\\"); v::attribute("name", v::userNameRule()) ->attribute("login", v::alnum("-_")) - >विशेषता("ईमेल", v::ईमेल()) ->विशेषता("पासवर्ड", v::notEmpty()->स्ट्रिंगटाइप()->लंबाई(शून्य, 64)) ->विशेषता("सहमत", v::trueVal()) ->assert((ऑब्जेक्ट) $data ) पकड़ें (NestedValidationException $ex) ( $messages = $ex->getMessages(); )

    GetMessages() का उपयोग करके हमें सत्यापन प्रक्रिया के दौरान सत्यापनकर्ता द्वारा एकत्र किए गए सभी संदेशों की एक सपाट सरणी मिलेगी। सरणी को डंप करने पर, हमें कुछ इस तरह मिलता है:


    सरणी(5) ( => स्ट्रिंग(29) "%s के लिए डेटा सत्यापन विफल" => स्ट्रिंग(60) "लॉगिन में केवल अक्षर (ए-जेड), अंक (0-9) और "-_"" => स्ट्रिंग होना चाहिए (25) "ईमेल वैध ईमेल होना चाहिए" => स्ट्रिंग(26) "पासवर्ड खाली नहीं होना चाहिए" => स्ट्रिंग(32) "सहमत विशेषता मौजूद होनी चाहिए" )

    आप संदेशों को अपने अनुसार बदल सकते हैं. शायद मैंने किसी तरह इस लाइब्रेरी को गलत समझा, लेकिन यह प्रक्रिया मुझे इतनी स्पष्ट नहीं लगी: आपको हैंडल किए गए अपवाद पर findMessages() विधि का उपयोग करने की आवश्यकता है, जिसमें आप संदेशों को विशेषताओं के लिए नहीं, बल्कि नियमों के लिए परिभाषित करते हैं।


    $ex->findMessages([ "userNameRule" => "उपयोगकर्ता नाम में दो शब्द होने चाहिए।", "alnum" => "हमें आपका लॉगिन पसंद नहीं है।", "ईमेल" => "आपको स्पष्ट रूप से पसंद नहीं है आप हमें अपना ई-मेल देना चाहते हैं।", "notEmpty" => "अच्छा, आपका पासवर्ड कहाँ है?", "सहमत" => "यह अफ़सोस की बात है कि आप असहमत हैं।" ]);

    मुझे नहीं पता कि क्या ग़लत है, लेकिन कुछ चीज़ें हैं जो मुझे अभी भी समझ नहीं आ रही हैं। उपरोक्त तरीके से नियमों को परिभाषित करने से हमें यही मिलता है:


    सरणी(5) (=>स्ट्रिंग(40) "उपयोगकर्ता नाम दो शब्द होना चाहिए।" => स्ट्रिंग(31) "हमें आपका लॉगिन पसंद नहीं है।" => स्ट्रिंग(25) "ईमेल वैध ईमेल होना चाहिए" = > स्ट्रिंग(5) "अच्छा, आपका पासवर्ड कहां है?" => स्ट्रिंग(9) "यह अफ़सोस की बात है कि आप सहमत नहीं हैं।"

    जैसा कि आप देख सकते हैं, ईमेल फ़ील्ड के लिए संदेश लागू नहीं किया गया था, मानक वाला ही बना रहा। लेकिन सूचकांक 4 पर संदेश इसके विपरीत है! और यह इस तथ्य के बावजूद है कि मैंने नियम के नाम का नहीं, बल्कि फ़ील्ड के नाम का उपयोग किया है। जबकि यदि मैंने नियम नाम (trueVal) का उपयोग किया होता, तो मेरा संदेश कहीं खो गया होता। इस लाइब्रेरी के अनुभवी उपयोगकर्ताओं की टिप्पणियों का बहुत स्वागत है।

    सीरियस सत्यापन

    ठीक है, चलिए अगली लाइब्रेरी पर चलते हैं और देखते हैं कि यह समान कार्यों को कैसे संभालती है।

    नियमों को परिभाषित करना

    एक बार फिर हमें उपयोगकर्ता नाम के लिए एक नियम परिभाषित करने की आवश्यकता है। हम इसे कुछ इस तरह लिखेंगे:


    वर्ग UserNameRule AbstractRule का विस्तार करता है ( // त्रुटि संदेश const MESSAGE = "उपयोगकर्ता नाम दो शब्द होना चाहिए।"; const LABELED_MESSAGE = "(लेबल) दो शब्द होना चाहिए।"; सार्वजनिक फ़ंक्शन सत्यापन ($ मूल्य, $ valueIdentifier = null ) ( वापसी (बूल) preg_match("/^+\s+$/u", $value ) )

    कृपया पहले से चर्चा की गई पुस्तकालयों की तुलना में दृष्टिकोण में अंतर पर ध्यान दें। हम गुणों, विधियों या नियम तर्कों का उपयोग करने के बजाय स्थिरांक में दो प्रकार के संदेशों को परिभाषित करते हैं।


    आइए अब सत्यापन तर्क का वर्णन करें:


    $सत्यापनकर्ता = नया सत्यापनकर्ता; $validator ->add("name", "required | MyApp\Validation\Rule\UserNameRule") ->add("login", "required | alphanumhyphen", null, "लॉगिन में केवल लैटिन अक्षर, डैश और अंडरस्कोर हो सकते हैं। ") ->जोड़ें("ईमेल", "आवश्यक | ईमेल", शून्य, "कृपया एक सही ईमेल दर्ज करें।") ->जोड़ें("पासवर्ड", "आवश्यक | अधिकतम लंबाई(64)", शून्य, "आपका पासवर्ड, सर।") ->जोड़ें("सहमत", "आवश्यक | बराबर(सही)", शून्य, "आप सहमत क्यों नहीं हुए?");

    जैसा कि आप देख सकते हैं, नियमों का सेट बहुत सरल और पठनीय है। विवरण के लिए, हम क्षैतिज पट्टियों द्वारा अलग किए गए नामों का उपयोग करते हैं। यह दृष्टिकोण लारवेल और कॉन्ट्रोलियो में उपयोग किए गए दृष्टिकोण के समान है।


    ऐड() विधि का चौथा तर्क सत्यापन त्रुटि संदेश का वर्णन करता है जिसे सत्यापन विफल होने पर सिरियस उपयोग करेगा। हमने अपने नए नियम के लिए कोई संदेश क्यों नहीं जोड़ा? उपयोगकर्ता नाम नियम?


    $सत्यापनकर्ता->जोड़ें("नाम", "आवश्यक | MyApp\Validation\Rule\UserNameRule")

    ऐसा इसलिए है क्योंकि संदेश पहले से ही वर्ग स्थिरांक में वर्णित हैं:


    वर्ग UserNameRule AbstractRule का विस्तार करता है ( // त्रुटि संदेश const MESSAGE = "उपयोगकर्ता नाम दो शब्दों का होना चाहिए।"; ...

    एक अन्य विकल्प सत्यापनकर्ता की addMessage() विधि का उपयोग करना है:


    $validator->addMessage('ईमेल', 'कृपया एक वैध ईमेल दर्ज करें');

    कृपया ध्यान दें कि कस्टम नियमों की पहचान उनके वर्ग के पूरे नाम से की जाती है, जबकि कॉन्ट्रोलियो में आप उपनाम/उपनाम निर्दिष्ट कर सकते हैं।

    प्रतिक्रिया

    सत्यापन करने के लिए, हम सत्यापनकर्ता विधि वैध() को कॉल करते हैं, इसमें डेटा पास करते हैं:


    $डेटा = [ "नाम" => "अल्बर्ट", // दो शब्द होने चाहिए "लॉगिन" => "@lbert", // "निषिद्ध" वर्ण @ "ईमेल" => "कुछ गलत", // होना चाहिए यहां एक ई-मेल भेजें "पासवर्ड" => "" // पासवर्ड बिल्कुल निर्दिष्ट नहीं है // "सहमत" सरणी में नहीं है क्योंकि उपयोगकर्ता ने बॉक्स को चेक नहीं किया है]; $सत्यापनकर्ता->सत्यापन($डेटा);

    रेस्पेक्ट के विपरीत, सीरियस कोई अपवाद नहीं फेंकेगा, बल्कि बस वापस लौट आएगा असत्य. सत्यापन त्रुटि संदेश getMessages() सत्यापनकर्ता विधि के माध्यम से प्राप्त किए जा सकते हैं। यह विशेषताओं द्वारा समूहीकृत त्रुटियों को लौटाता है, इसलिए त्रुटियों से गुजरने के लिए हमें दो फ़ोरैच लूप की आवश्यकता होती है:


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

    यहां $message एक क्लास ऑब्जेक्ट है सिरियस\मान्यता\त्रुटिसंदेश, जिसमें एक getTemplate() विधि है जो हमें आवश्यक संदेश लौटाती है।

    वैलिट्रॉननियमों को परिभाषित करना

    पहला अंतर: एक नया नियम जोड़ने के लिए, आपको एक अलग वर्ग बनाने की आवश्यकता नहीं है। आप बस एक क्लोजर का उपयोग कर सकते हैं जो बूलियन परिणाम लौटाता है।


    कस्टम नियम जोड़ने के लिए, वैलिट्रॉन के पास एक स्थिर विधि addRule() है, जिसमें पहले दो तर्क आवश्यक हैं, और तीसरा वैकल्पिक है। मुझे यह तरीका पसंद आया, क्योंकि यह नियम पहचानकर्ता, तर्क और त्रुटि संदेश एक ही स्थान पर दिखाता है।


    वैलिट्रॉन\Validator का उपयोग करें; Validator::addRule("two_words", function($field, $value) ( ​​​​ return (bool) preg_match("/^+\s+$/u", $value); ), "उपयोगकर्ता नाम बिल्कुल सही होना चाहिए दो शब्द ");

    दूसरा अंतर यह है कि नियमों को विशेषताओं पर कैसे लागू किया जाता है। पिछले सभी मामलों में, हमने देखा कि एक विशेषता, जैसे वह थी, एक प्राथमिक चीज़ है।


    वैलिट्रॉन ने एक अलग रास्ता अपनाया और सत्यापन नियम पहले रखे। नियमों का वर्णन करके, आप इन नियमों में विशेषताएँ लागू करते प्रतीत होते हैं, न कि इसके विपरीत।


    $सत्यापनकर्ता = नया सत्यापनकर्ता($डेटा); $ सत्यापनकर्ता -> नियम ("दो_शब्द", "नाम") -> लेबल ("") -> नियम ("आवश्यक", ["नाम", "लॉगिन", "ईमेल", "पासवर्ड", "सहमत" ] ) ->नियम('स्लग', 'लॉगिन') ->नियम('ईमेल', 'ईमेल') ->नियम('स्वीकृत', 'सहमत');

    जैसा कि उदाहरण से देखा जा सकता है, नियम() विधि में हम पहले नियम का नाम लिखते हैं, और उसके बाद ही उन विशेषताओं को इंगित करते हैं जो इस नियम के अनुरूप होनी चाहिए। एक अधिक स्पष्ट उदाहरण आवश्यक नियम है, जो दर्शाता है कि विशेषताएँ उस नियम से कैसे "संबंधित" हैं।


    वैलिट्रॉन (अन्य समाधानों की तरह जिनकी हमने समीक्षा की है) मानक त्रुटि संदेश प्रदान करता है। यदि आप बस उनका उपयोग करते हैं, तो आप देखेंगे कि प्रत्येक संदेश संबंधित विशेषता के नाम से शुरू होता है।


    गैर-मानक त्रुटि संदेशों का उपयोग किए जाने पर भी वैलिट्रॉन संदेश पाठ में विशेषता नामों को प्रतिस्थापित करता है। इसीलिए हमने विशेषता नाम को हटाने के लिए एक खाली स्ट्रिंग के साथ लेबल() विधि का उपयोग किया।


    $सत्यापनकर्ता->नियम("दो_शब्द", "नाम")->लेबल("") प्रतिक्रिया

    विशेष रूप से सत्यापन के संबंध में, वैलिट्रॉन लाइब्रेरी एपीआई व्यावहारिक रूप से उस चीज़ से अलग नहीं है जो हमने पहले ही लेख में देखी है। सत्यापन करने के लिए हम सत्यापनकर्ता विधि को मान्य() कहते हैं:


    $सत्यापनकर्ता->सत्यापन();

    सत्यापन त्रुटि संदेशों को getErrors() विधि का उपयोग करके पुनर्प्राप्त किया जा सकता है:


    $सत्यापनकर्ता->त्रुटियाँ();

    यहां संदेशों को सीरियस वैलिडेशन की तरह ही विशेषताओं द्वारा समूहीकृत किया गया है, सिवाय इसके कि संदेश के लिए कोई अलग वर्ग नहीं है, और हमें एक नियमित बहु-आयामी सरणी मिलती है।


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

    और अंत में, आज की आखिरी लाइब्रेरी मेरा अपना विकास है जिसे कॉन्ट्रोलियो कहा जाता है।

    नियमों को परिभाषित करना

    फिर से, पांचवीं बार, हम उपयोगकर्ता नाम के लिए एक सत्यापन नियम बनाएंगे। सब कुछ अपेक्षाकृत सरल और मानक है:


    नेमस्पेस MyProject\Validation\Rules; कॉन्ट्रोलियो\नियम\सार नियम का उपयोग करें; क्लास टूवर्ड्स Kontrolio\Rules\AbstractRule का विस्तार करता है (सार्वजनिक फ़ंक्शन isValid($input = null) ( return (bool) preg_match("/^+\s+$/u", $input); ) )

    अब हम एक फ़ैक्टरी बनाते हैं और उसमें विस्तार() विधि का उपयोग करके एक नियम पंजीकृत करते हैं:


    नेमस्पेस मायप्रोजेक्ट; कॉन्ट्रोलियो\फ़ैक्टरी का उपयोग करें; MyProject\Validation\Rules\TwoWords का उपयोग करें; $फ़ैक्टरी = कॉन्ट्रोलियो\फ़ैक्टरी::getInstance()->extend();

    नियम को पंजीकृत करने के बाद, हम इसका उपयोग कर सकते हैं, जिसमें नाम भी शामिल है - दो_शब्द। आइए एक सत्यापनकर्ता बनाएं:


    $डेटा = [ "नाम" => "अल्बर्ट", // दो शब्द होने चाहिए "लॉगिन" => "@lbert", // "निषिद्ध" वर्ण @ "ईमेल" => "कुछ गलत", // होना चाहिए यहां एक ई-मेल भेजें "पासवर्ड" => "" // पासवर्ड बिल्कुल निर्दिष्ट नहीं है // "सहमत" सरणी में नहीं है क्योंकि उपयोगकर्ता ने बॉक्स को चेक नहीं किया है]; $नियम = ["नाम" => "दो_शब्द", "लॉगिन" => "कभी-कभी|अल्फाडैश", "ईमेल" => "ईमेल", "पासवर्ड" => "लंबाई:1.64", "सहमत" => " स्वीकृत" ]; $messages = [ "नाम" => "उपयोगकर्ता नाम में दो शब्द होने चाहिए।", "लॉगिन" => "हमें आपका लॉगिन पसंद नहीं है।", "ईमेल" => "आप स्पष्ट रूप से देना नहीं चाहते हैं हमें आपका ईमेल।", "पासवर्ड" => "अच्छा, आपका पासवर्ड कहाँ है?", "सहमत" => "यह अफ़सोस की बात है कि आप सहमत नहीं हैं।" ]; $सत्यापनकर्ता = $फैक्टरी->बनाना($डेटा, $नियम, $संदेश);

    हमने लारवेल में उपयोग किए गए वाक्यविन्यास के समान एक वाक्यविन्यास का उपयोग करके नियमों का वर्णन किया, हालांकि हम अधिक क्रियात्मक संस्करण का उपयोग कर सकते थे:


    $नियम = ["नाम" => नए दो शब्द, "लॉगिन" => , "ईमेल" => नया ईमेल, "पासवर्ड" => नई लंबाई(1, 64), "सहमत" => नया स्वीकृत ]; प्रतिक्रिया

    सत्यापन उसी मान्य() विधि का उपयोग करके शुरू किया गया है:


    $सत्यापनकर्ता->सत्यापन();

    अब हम getErrors() या getErrorsList() तरीकों में से किसी एक का उपयोग करके त्रुटि संदेश प्राप्त कर सकते हैं। पहली विधि अधिक जटिल त्रुटि आउटपुट की अनुमति देती है, जबकि दूसरी एक सपाट सरणी लौटाती है। GetErrors() का उपयोग करके हम संदेशों को कुछ इस तरह आउटपुट कर सकते हैं:



    और getErrorsList() से आप संदेशों की एक सरल सूची बना सकते हैं:


    जमीनी स्तर

    इस लेख में मैंने निम्नलिखित पुस्तकालयों के उपयोग के उदाहरण दिखाए हैं:

  • आभा.फ़िल्टर
  • मान्यता का सम्मान करें
  • सीरियस सत्यापन
  • वैलिट्रॉन
  • नियंत्रण
  • एक "वास्तविक दुनिया का उदाहरण" बहुत सरल लग सकता है। मुझे सहमत होना होगा, क्योंकि, वास्तव में, कुछ पुस्तकालय क्षमताओं को लेख से बाहर रखा गया था। सिद्धांत रूप में, यदि आप रुचि रखते हैं, तो आप स्वयं उनकी विशेषताओं का अध्ययन कर सकते हैं।


    प्रत्येक पुस्तकालय की अपनी विशेषताएं हैं और उसके कुछ स्याह पक्ष भी हैं, इसलिए मुझे लगता है कि किसी एक को चुनना स्वाद और चुनौती का मामला है।


    पढ़ने के लिए धन्यवाद। सही चुनाव करो।

    टैग: टैग जोड़ें

    सभी को शुभ संध्या (रात की तरह - संपादक का नोट)। आज हम उसमें थोड़ा सुधार करेंगे. सबसे पहले, आइए जानें कि PHP में फॉर्म सत्यापन कैसे करें और कुछ सुरक्षा हेरफेर कैसे करें।

    तो, नीचे दिए गए कोड को देखें और निम्नलिखित परिवर्तनों और परिवर्तनों के निम्नलिखित कारणों पर ध्यान दें। मैंने सभी नई पंक्तियों को रंग से हाइलाइट किया।

    प्रपत्र फ़ील्ड का नाम बदल दिया गया है. आप पूछ सकते हैं - हमें इसकी आवश्यकता क्यों है? यह सरल है, मैं आपको उत्तर दूँगा। जहां तक ​​मुझे पता है, कुछ स्पैम बॉट फॉर्म की तलाश में साइटों को खंगालते हैं और इन क्षेत्रों के नाम के आधार पर उन्हें भरते हैं। सिद्धांत रूप में, यदि उन्हें कोई जोड़ा नहीं मिलता है, तो वे घर चले जाते हैं, जो हम चाहते हैं। बेशक, मुझे नहीं लगता कि इस सुरक्षा की डिग्री विशेष रूप से बहुत अच्छी है, लेकिन इससे हमें कोई नुकसान नहीं होगा, और यदि स्पैम ईमेल में 1 अक्षर की कमी आती है, तो यह अच्छा होगा =)।

    जाँच कर रहा है कि ईमेल पता सही दर्ज किया गया है या नहीं। लाइन 17 एल्सिफ ऑपरेटर का उपयोग करती है, जिसकी जांच की जाएगी यदि हमें कोई सकारात्मक उत्तर मिलता है, यानी, यह कहा गया है कि ईमेल पता बिल्कुल गायब था, यानी, यह दर्ज नहीं किया गया था। यहां हम preg_match फ़ंक्शन का उपयोग करते हैं, जो हमें दर्ज पते की तुलना करने की अनुमति देता है नियमित अभिव्यक्ति. शायद मैं बाद में रेगुलर एक्सप्रेशन के बारे में संक्षेप में लिखूंगा, लेकिन अभी यह जानने लायक है नियमित अभिव्यक्तिएक टेम्प्लेट बनाता है जिसके विरुद्ध हमारी स्ट्रिंग की जाँच की जाती है। और यदि, हमारे मामले में, दर्ज किया गया पता अभिव्यक्ति से मेल नहीं खाता है, तो फिर से एक त्रुटि प्रदर्शित की जाएगी। उदाहरण के लिए, यहां कुछ और नियमित अभिव्यक्तियां दी गई हैं:
    |^[-а-яе\s\.,;:\?!]+$|i- यह नियमित अभिव्यक्ति आपको केवल रूसी वर्णमाला और कुछ वर्णों जैसे कि स्थान, अवधि, अल्पविराम इत्यादि का उपयोग करने की अनुमति देती है।
    #http://[-a-z0-9_.]+[-a-z0-9_:@&?=+,.!/~*'%$]*\.(html?|php)#i- और यह अभिव्यक्ति आपको इंटरनेट पर किसी पते की सही वर्तनी की जांच करने की अनुमति देती है।

    इसके बाद, हम अन्य ऑपरेटर का उपयोग करते हैं, जहां पत्र भेजने के लिए हमारा सारा कोड पहले ही स्थानांतरित हो चुका है। आप किसी भी मात्रा में स्वयं सत्यापन नियम बना सकते हैं, जैसे कि ईमेल पते की जांच करने के लिए, बस नए नियम जोड़ें, और आप खुश होंगे।




    संपर्क व्यक्ति:



    ई - मेल से संपर्क करे:



    संदेश:






    इस प्रकार आप किसी बाहरी चीज़ का सहारा लिए बिना अपने PHP फॉर्म को मान्य कर सकते हैं। अगली बार फॉर्म के विषय पर एक पोस्ट में, मुझे लगता है, jQuery में फॉर्म के सत्यापन पर विचार किया जाएगा। इस बीच, मैं आपकी टिप्पणियों और शुभकामनाओं का इंतजार कर रहा हूं। सभी को शुभ रात्रि और शुभ प्रभात =)।

    हम POST या GET डेटा के सत्यापन के बारे में बात करेंगे, हालांकि सिद्धांत रूप में इसे कुकीज़ जैसे अन्य तरीकों से प्राप्त डेटा पर भी लागू किया जा सकता है। जैसे ही आप कोई वेब एप्लिकेशन विकसित करते हैं, आपको उपयोगकर्ताओं के साथ बातचीत करने के लिए एक इंटरफ़ेस लिखना होगा और स्वाभाविक रूप से उपयोगकर्ताओं को सर्वर पर डेटा भेजने के लिए विभिन्न फॉर्म बनाने होंगे। उदाहरण के लिए, ये टिप्पणियाँ हो सकती हैं। मुझे लगता है कि यह सभी के लिए स्पष्ट और स्पष्ट है कि प्राप्त डेटा को यह देखने के लिए जांचने की आवश्यकता है कि क्या यह प्रकार, आकार और निर्दिष्ट सीमा से मेल खाता है। सबसे पहले, यह सिस्टम, वेबसाइट या डेटाबेस की सुरक्षा के लिए आवश्यक है, क्योंकि... गलत तरीके से प्रसारित डेटा या जानबूझकर खराब तरीके से बनाया गया अनुरोध किसी हमलावर तक पहुंच खोल सकता है।

    दूसरे, असत्यापित डेटा, यदि गलत है, तो स्क्रिप्ट, सिस्टम या संपूर्ण सर्वर के अस्थिर संचालन का कारण बन सकता है। इसलिए, सभी डेटा की जांच और दोबारा जांच करने की आवश्यकता है; शायद कोई कहेगा कि अत्यधिक व्याकुलता की कोई आवश्यकता नहीं है, लेकिन मेरा मानना ​​है कि इस मामले में यह अत्यधिक नहीं हो सकता है।

    किसी भी बहाने से, किसी भी परिस्थिति में, उपयोगकर्ताओं से प्राप्त डेटा पर भरोसा न करें। ऐसा होता है कि हम कोड लिखने में बहुत आलसी होते हैं जो प्राप्त डेटा को एक बार फिर से जांचता है, या हम ऐसी आशा करते हैं मौजूदा तरीकेजाँच ही काफी है, जिसके परिणामस्वरूप हम अपने आप को रियायतें देते हैं।

    विषय से थोड़ा हटकर:
    परियोजनाओं, विकास और प्रोग्रामिंग वेबसाइटों, स्क्रिप्ट और अन्य प्रणालियों पर काम करने में मेरा लगभग सारा खाली समय (कार्य समय के अलावा) चला जाता है, दूसरे शब्दों में, मैं यह काम दिन में अधिकतम संभव घंटों तक करता हूं। समय-समय पर मनोरंजन या सिर्फ जिज्ञासा के लिए किसी चीज़ का परीक्षण करने की ज़रूरत होती है। परिणामस्वरूप, घरेलू इंजनों या प्राचीन संस्करणों के सीएमएस का उपयोग करके जल्दबाजी में बनाई गई साइटें परीक्षण प्रयोगशाला चूहों के समान बन जाती हैं। बेशक, उपरोक्त सभी टेढ़े-मेढ़े कोड, डेटा नियंत्रण की कमी और विभिन्न बगों से ग्रस्त हैं। असल में, ज्यादातर मामलों में, ऐसी साइटों पर अपने प्रयोगों के एक घंटे में, मैं कई गंभीर कमजोरियों का पता लगाने में कामयाब होता हूं, और उनमें से अधिकतर प्राप्त डेटा की अपर्याप्त मान्यता में निहित हैं। में हाल ही मेंयह अक्सर उन स्क्रिप्ट्स में पाया जाता है जो JavaScript + Ajax से आने वाले POST डेटा को प्रोसेस करते हैं।

    जाहिरा तौर पर, अजाक्स का उपयोग करके इन स्क्रिप्ट को लिखने वाले प्रोग्रामर का मानना ​​​​है कि चूंकि सभी अनुरोध पृष्ठभूमि में होते हैं, उपयोगकर्ता की जानकारी के बिना या पृष्ठ को फिर से लोड किए बिना, तो डेटा को विशेष रूप से जांचने की आवश्यकता नहीं होती है।

    एक नियम के रूप में, इनमें से कई लिपियाँ इतनी छिद्रों से भरी होती हैं कि बिना अधिक प्रयास के वे एक बड़ा छेद बनाने और अपने खोल को भरने में सफल हो जाती हैं। बेशक, केवल प्रयोग के उद्देश्य से और इससे अधिक कुछ नहीं (ऐसी साइटों के प्रशासन को हमेशा मौजूदा कमजोरियों के बारे में सूचित किया जाता है)।

    मुझे लगता है कि सत्यापन का महत्व हर किसी के लिए स्पष्ट है। लंबे समय तक, मैंने हर बार कोड का एक ही टुकड़ा लिखा, फिर अपने स्वयं के डेटा सत्यापन कार्यों का उपयोग किया, जिनमें से कई बहुत ही प्राचीन थे और आमतौर पर हर जगह बिखरे हुए थे विभिन्न भाग(संलग्न फाइल। जल्द ही मैं PHP फ्रेमवर्क ज़ेंड, सीआई, कोहाना से परिचित होने लगा, जिनमें से प्रत्येक ने अपने प्रोजेक्ट के लिए उधार लिए गए डेटा को सत्यापित करने के लिए अपनी स्वयं की कक्षा लागू की। अंत में, मैंने सीआई कक्षाओं में से एक को अपनी आवश्यकताओं के अनुरूप बनाने का निर्णय लिया, लेकिन यह पता चला कि प्रोग्रामिंग ब्लॉगों में से एक के लेखक ने पहले ही इस बात का ध्यान रखा था। इसके बाद, मैं उनके कार्यों को साझा करता हूं, अर्थात् संशोधित कोडइग्निटर लाइब्रेरी।

    आइए निम्नलिखित कोड देखें:

    कोड देखेंपीएचपी

    require_once "validator.class.php" ; $सत्यापनकर्ता = नया सत्यापनकर्ता() ; $validator -> set_rules ("नाम", "आपका नाम", सरणी ("आवश्यक" =>, "अल्फा" => ) ) ; $validator -> set_rules ("ईमेल", "आपका ईमेल", सरणी ("आवश्यक" => "फ़ील्ड %s आवश्यक है", "valid_email" => ) ) ; यदि ($validator -> run() ) ( echo "सत्यापन सफल रहा" ; ) अन्यथा ( echo $validator -> get_string_errors() ; )

    जैसा कि आप उदाहरण से देख सकते हैं, पहली पंक्ति में हम क्लास फ़ाइल शामिल करते हैं सत्यापनकर्ता.calss.phpहमारी स्क्रिप्ट के लिए. इसके बाद, हम क्लास का एक उदाहरण बनाते हैं और ऑब्जेक्ट को एक वेरिएबल में सहेजते हैं $सत्यापनकर्ता.
    फिर विधि का प्रयोग करें $सत्यापनकर्ता->सेट_नियम($फ़ील्ड, $लेबल, $नियम)सत्यापन के लिए फ़ील्ड सेट करें।

    यह विधि 3 पैरामीटर लेती है:

  • $फ़ील्ड- सत्यापन फ़ील्ड का नाम (टैग में नाम विशेषता का मान)
  • $लेबल- सत्यापन फ़ील्ड का नाम, त्रुटि संदेशों में डाला जाएगा
  • $नियम- सत्यापन नियमों की एक श्रृंखला, जिसमें सत्यापन नियम को कुंजी के रूप में उपयोग किया जाता है, और इस नियम के लिए त्रुटि संदेश को मान के रूप में उपयोग किया जाता है
  • सत्यापन के लिए सभी फ़ील्ड सेट होने के बाद, हम विधि का उपयोग करके सत्यापनकर्ता लॉन्च करते हैं $सत्यापनकर्ता->चलाएँ(). यदि सत्यापन सफल रहा, तो यह विधि मान लौटा देगी सत्य, अन्यथा, यदि कोई त्रुटि हो, तो यह वापस आ जाएगा असत्य.

    त्रुटि संदेश प्राप्त करने की तीन विधियाँ हैं:

  • get_string_errors()- सभी त्रुटि संदेशों को एक स्ट्रिंग के रूप में लौटाता है
  • get_array_errors()- सभी संदेशों को एक सरणी के रूप में लौटाता है, जहां फ़ील्ड नाम को कुंजी के रूप में उपयोग किया जाता है, और इस फ़ील्ड के लिए त्रुटि विवरण को मान के रूप में उपयोग किया जाता है।
  • form_error($फ़ील्ड)- $ फ़ील्ड पैरामीटर के रूप में पारित फ़ील्ड के लिए एक त्रुटि संदेश देता है
  • डिफ़ॉल्ट रूप से, त्रुटि संदेश एक टैग में लपेटे जाते हैं . अपना डिज़ाइन सेट करने के लिए, विधि का उपयोग करें set_error_delimiters($उपसर्ग, $प्रत्यय). उदाहरण के लिए इस प्रकार:

    अब एरर मैसेज बदल जायेंगे डिवकक्षा के साथ "गलती"

    जैसा कि आप देख सकते हैं, सब कुछ बहुत सरल है।

    कोड देखेंपीएचपी

    $सत्यापनकर्ता -> set_error_delimiters (" " , " " ) ;

    सत्यापन नियम निर्धारित करने के लिए, आप विधि का उपयोग कर सकते हैं set_rules($फ़ील्ड)एक बहुआयामी सहयोगी सरणी पास करें। आइए एक उदाहरण देखें:

    कोड देखेंपीएचपी

    $नियम = सरणी (सरणी ("फ़ील्ड" => "नाम", "लेबल" => "आपका नाम", "नियम" => सरणी ("आवश्यक" => "फ़ील्ड %s आवश्यक है", "अल्फ़ा" = > "फ़ील्ड %s में केवल अक्षर होने चाहिए"), सरणी ("फ़ील्ड" => "ईमेल", "लेबल" => "आपका ईमेल", "नियम" => सरणी ("आवश्यक" => "फ़ील्ड % s है आवश्यक", "valid_email" => "फ़ील्ड %s में एक वैध ईमेल पता होना चाहिए" ) ) ); $सत्यापनकर्ता -> set_rules ($नियम ) ;

    जैसा कि आप देख सकते हैं, मैंने पहले उदाहरण के समान सत्यापन नियम केवल एक बहुआयामी साहचर्य सरणी के रूप में लिखे हैं। आप किसी भी ऐसी विधि का उपयोग कर सकते हैं जो किसी भी स्थिति में आपके लिए सबसे उपयुक्त हो।

    तो, यह वर्ग किन सत्यापन नियमों का समर्थन करता है?

    मैं इस कक्षा में सबसे सामान्य सत्यापन नियम लेकर आया हूं जिनका सामना हर किसी को करना पड़ता है। यहाँ पूरी सूचीये नियम:

    आवश्यकयदि फ़ील्ड खाली है तो FALSE लौटाता है
    पूर्णांकयदि मान पूर्णांक नहीं है तो गलत लौटाता है
    तैरनायदि मान संख्यात्मक मान नहीं है तो गलत लौटाता है
    वैध_यूआरएलयदि मान वैध URL नहीं है तो गलत लौटाता है
    वैध ईमेलयदि मान वैध ईमेल पता नहीं है तो गलत लौटाता है
    वैध_आईपीयदि आईपी पता वैध नहीं है तो गलत लौटाता है
    माचिसयदि तत्व किसी अन्य फ़ील्ड तत्व के मान से मेल नहीं खाता है तो FALSE लौटाता है
    अल्फायदि तत्व में केवल अक्षरों से अधिक अक्षर हैं तो गलत लौटाता है
    वैध_कैप्चायदि सत्र फ़ील्ड का मान प्रपत्र फ़ील्ड के मान के बराबर नहीं है, तो गलत लौटाता है
    वाजिब तारीखयदि तत्व में कोई अमान्य दिनांक है तो FALSE लौटाता है

    इनमें से अधिकांश नियम फ़िल्टर का उपयोग करते हैं, जो PHP 5 में उपलब्ध हो गए।

    यदि आप चाहें, तो आप वैलिडेटर वर्ग में आवश्यक फ़ंक्शन जोड़कर सत्यापन के लिए नियमों के सेट का हमेशा विस्तार कर सकते हैं।

    संसाधित POST डेटा मान प्राप्त करने के लिए, निम्न विधि का उपयोग करें:

    कोड देखेंपीएचपी

    आमतौर पर इस विधि को फॉर्म के सफल प्रसंस्करण पर फॉर्म को साफ़ करने के लिए कहा जाता है।


    पिछले लेख में मैंने अन्य उपलब्ध समाधानों के साथ अपनी लाइब्रेरी की तुलना लिखने का वादा किया था, इसलिए आज हम Aura.Filter, Respect Validation, Sirius Validation और Valitron का उपयोग करके सत्यापन को देखेंगे।


    आइए कल्पना करें कि हमारे पास विकास में एक निश्चित सार्वजनिक सेवा है जिसके लिए उपयोगकर्ताओं को सभी कार्यों तक पूर्ण पहुंच के लिए पंजीकरण करने की आवश्यकता होती है। इस प्रकार, पंजीकरण फॉर्म में निम्नलिखित फ़ील्ड होंगे:

  • नाम।
  • इसमें बिल्कुल दो शब्द होने चाहिए, पहला उपयोगकर्ता का पहला नाम और दूसरा अंतिम नाम।
  • ईमेल।
  • ईमेल।
  • एक वैध पता होना चाहिए
  • ईमेल


    पासवर्ड।

    सेट होना चाहिए और 64 अक्षरों से अधिक लंबा नहीं होना चाहिए।

    मान गया।

    एक विशिष्ट चेकबॉक्स जिसे उपयोगकर्ता को सेवा की शर्तों की स्वीकृति की पुष्टि करने के लिए जांचना होगा।

  • इसलिए, हमारे पास पांच फ़ील्ड हैं जिन्हें हमारी काल्पनिक सेवा के साथ पंजीकरण करने के लिए उपयोगकर्ता को भरना होगा। आइए कल्पना करें कि हमें इनपुट के रूप में पूरी तरह से अमान्य डेटा प्राप्त हुआ:
  • $डेटा = [ "नाम" => "अल्बर्ट", // दो शब्द होने चाहिए "लॉगिन" => "@lbert", // "निषिद्ध" वर्ण @ "ईमेल" => "कुछ गलत", // होना चाहिए एक ई-मेल "पासवर्ड" => Aura.Filter बनें
  • Aura.Filter का उपयोग करके सत्यापन एक फ़िल्टर फ़ैक्टरी से शुरू होता है। हमें एक तथाकथित "विषय फ़िल्टर" बनाने की आवश्यकता है, क्योंकि हम एक सरणी को मान्य करेंगे, न कि किसी व्यक्तिगत मान को।
  • हम नियमों को परिभाषित करते हैं Aura\Filter\FilterFactory; $फ़िल्टर = (नया फ़िल्टरफ़ैक्टरी)->नयाविषयफ़िल्टर(); $filter->validate("name") ->isNotBlank() ->is("two_words") ->setMessage("नाम दो शब्दों का होना चाहिए।"); $filter->validate("login") ->isBlankOr("alnum") ->setMessage("यदि आप एक लॉगिन निर्दिष्ट करते हैं, तो इसमें केवल लैटिन अक्षर होने चाहिए।"); $filter->validate("email") ->isNotBlank() ->is("email") ->setMessage("कृपया एक वैध ईमेल पता दर्ज करें।"); $filter->validate("password") ->isNotBlank() ->is("strlenMax", 64) ->setMessage("कृपया अपना पासवर्ड लिखें।"); $फ़िल्टर->मान्य करें("सहमत") ->है("कॉलबैक", फ़ंक्शन($विषय, $फ़ील्ड) (वापसी $विषय->($फ़ील्ड) === सत्य; ))->सेटमैसेज("आपको चाहिए सेवा की शर्तों से सहमत हूँ");
  • एक वैध ईमेल पता होना चाहिए.
  • आपने शायद देखा होगा कि मैंने दो_शब्द नियम निर्दिष्ट नहीं किया है। स्वाभाविक रूप से, Aura.Filter में ऐसा कोई नियम नहीं है, इसलिए हमें एक बनाने की आवश्यकता है। जैसा कि दस्तावेज़ में कहा गया है, यह नियम के लिए एक अलग वर्ग का उपयोग करके किया जाता है:


    /** * नियम जो उपयोगकर्ता नाम को मान्य करता है। * उपयोगकर्ता नाम में दो शब्द होते हैं: पहला और अंतिम नाम, एक स्थान से अलग। */ क्लास यूजरनेमरूल (/** * यूजरनेम को मान्य करता है। * * @param ऑब्जेक्ट|array $subject * @param string $field * @param int $max * * @return bool */ public function __invoke($subject, $field , $अधिकतम = शून्य) ($मान = $विषय->($फ़ील्ड); यदि (! is_scaler($मूल्य)) ( गलत वापसी; ) वापसी (बूल) preg_match("/^+\s+$/u", $मूल्य);

    दूसरा चरण फ़िल्टर फ़ैक्टरी को हमारे नए नियम के बारे में बताना है। यह फ़िल्टर फ़ैक्टरी के नियमों की एक श्रृंखला के रूप में पहला तर्क पारित करके किया जाता है:


    अगला कदम Aura.Filter को सूचित करना है कि हमने एक नया नियम बनाया है और इसका उपयोग करना चाहते हैं। यह फ़ैक्टरी के पहले तर्क में नियमों की एक श्रृंखला पारित करके किया जाता है:


    Aura\Filter\FilterFactory का उपयोग करें; $rules = ["two_words" => function() (नया UserNameRule लौटाएँ; ) ]; $फ़िल्टर = (नया फ़िल्टरफ़ैक्टरी($नियम))->नयाविषयफ़िल्टर();

    अब हमारे दो_शब्द नियम का उपयोग किसी अन्य मानक नियम की तरह ही किया जा सकता है।

    प्रतिक्रिया

    जैसा कि आपको याद है, आने वाला डेटा जिसे हम सत्यापित करते हैं वह पूरी तरह से अमान्य है, क्योंकि प्रत्येक फ़ील्ड में गलत मान होता है या इसमें बिल्कुल भी शामिल नहीं होता है। इसलिए, यह माना जाता है कि सत्यापन के परिणामस्वरूप हमें त्रुटियां और उनके बारे में संबंधित संदेश प्राप्त होंगे।


    हम Aura.Filter के साथ निम्नानुसार सत्यापन करते हैं:


    $मान्य = $फ़िल्टर->लागू करें($डेटा); यदि (! $ मान्य) ($ विफलताएं = $ फ़िल्टर-> getFairures(); $ संदेश = $ विफलताएं-> getMessages(); )

    में $संदेशएक सरणी लिखी जा रही है, इसलिए संदेश प्रदर्शित करने के लिए हमें दो नेस्टेड फ़ोरैच की आवश्यकता है:


    मान्यता का सम्मान करें

    तुलना में मैंने जिस दूसरी लाइब्रेरी का उपयोग किया वह एक अपेक्षाकृत लोकप्रिय समाधान है जिसे रेस्पेक्ट वैलिडेशन कहा जाता है। चूँकि लोग उस पर भरोसा करते हैं, मुझे लगता है कि वहाँ देखने लायक कुछ है।


    प्रयोग की शुद्धता के लिए, पुस्तकालयों की तुलना करते समय, हम शुरुआत में परिभाषित समान डेटा सेट का उपयोग करेंगे:


    Respect\Validation\Validator को v के रूप में उपयोग करें; $डेटा = [ "नाम" => "अल्बर्ट", // दो शब्द होने चाहिए "लॉगिन" => "@lbert", // "निषिद्ध" वर्ण @ "ईमेल" => "कुछ गलत", // होना चाहिए यहां एक ई-मेल भेजें "पासवर्ड" => "" // पासवर्ड बिल्कुल निर्दिष्ट नहीं है // "सहमत" सरणी में नहीं है क्योंकि उपयोगकर्ता ने बॉक्स को चेक नहीं किया है]; नियमों को परिभाषित करना

    Aura.Filter की तरह, हमें उपयोगकर्ता नाम के लिए अपने स्वयं के सत्यापन नियम की आवश्यकता है, तो चलिए वहीं से शुरू करते हैं:


    नेमस्पेस मायनेमस्पेस; Respect\Validation\Rules\AbstractRule का उपयोग करें; वर्ग उपयोगकर्ता नाम नियम सार नियम का विस्तार करता है (सार्वजनिक फ़ंक्शन सत्यापन ($ इनपुट) (वापसी (बूल) preg_match ("/^+\s+$/u", $input); ))

    बाहरी नियम एपीआई लगभग Aura.Filter के समान है, __invoke() जादू के बजाय केवल मान्य() विधि का उपयोग किया जाता है। मुझे ऐसा लगा, यह एपीआई, सरल और अधिक समझने योग्य है। खैर, यह कॉन्ट्रोलियो के करीब है :)


    मुझे दस्तावेज़ में इसका कोई उल्लेख नहीं मिला, हालाँकि, नियम के अलावा, आपको इसके लिए अपना स्वयं का अपवाद प्रकार बनाना होगा। अपवाद वर्ग के नाम में नियम वर्ग का नाम और एक पोस्टफिक्स शामिल होना चाहिए अपवाद.


    Respect\Validation\Exceptions\NestedValidationException का उपयोग करें; वर्ग UserNameRuleException NestedValidationException का विस्तार करता है ( // )

    खैर, अंततः हम अपने डेटा को सत्यापित कर सकते हैं। सबसे पहले, हम अपना नया नियम सत्यापनकर्ता को देते हैं ताकि उसे इसके बारे में पता चले और हम भविष्य में इसका उपयोग कर सकें। रेस्पेक्ट वैलिडेशन में, यह with() विधि को कॉल करके, उस नेमस्पेस को पास करके किया जाता है जिसमें गैर-मानक नियम स्थित हैं।


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

    अब सभी गैर-मानक नियम नामस्थान में स्थित हैं मेरा नामस्थान, सत्यापनकर्ता द्वारा "मान्यता प्राप्त" की जाएगी। अगला कदम आवश्यक नियमों का वर्णन करना और सत्यापन करना है।


    v::विशेषता("नाम", v::userNameRule()) ->विशेषता("लॉगिन", v::alnum("-_")) ->विशेषता("ईमेल", v::ईमेल()) ->विशेषता("पासवर्ड", v::notEmpty()->stringType()->लंबाई(शून्य, 64)) ->विशेषता("सहमत", v::trueVal()) ->assert((ऑब्जेक्ट) $डेटा);

    ध्यान दें कि हम अपने नियम को विशेषता पर कैसे लागू करते हैं नाम. यहां नियम वर्ग का नाम सत्यापनकर्ता विधि के नाम में बदल दिया गया है। बाकी नियम सामान्यतः सहज ज्ञान युक्त हैं।


    यह अलग से उल्लेख करने लायक है कि हम सरणी क्यों प्रदान करते हैं $डेटावस्तु को. तथ्य यह है कि रेस्पेक्ट वैलिडेशन इनपुट के रूप में ऑब्जेक्ट को स्वीकार करता है, सरणियों को नहीं। इस लाइब्रेरी का उपयोग करते हुए विकास करते समय इसे ध्यान में रखा जाना चाहिए।

    प्रतिक्रिया

    Aura.Filter के विपरीत, सत्यापन विफल होने पर Respect सत्यापनकर्ता एक अपवाद फेंकता है। और इस अपवाद में सत्यापन त्रुटि संदेश शामिल हैं। इसलिए, जो उदाहरण अभी दिखाया गया था उसे इस प्रकार लिखा जाना चाहिए:


    प्रयास करें ( v::with("RespectValidationExample\\"); v::attribute("name", v::userNameRule()) ->attribute("login", v::alnum("-_")) - >विशेषता("ईमेल", v::ईमेल()) ->विशेषता("पासवर्ड", v::notEmpty()->स्ट्रिंगटाइप()->लंबाई(शून्य, 64)) ->विशेषता("सहमत", v::trueVal()) ->assert((ऑब्जेक्ट) $data ) पकड़ें (NestedValidationException $ex) ( $messages = $ex->getMessages(); )

    GetMessages() का उपयोग करके हमें सत्यापन प्रक्रिया के दौरान सत्यापनकर्ता द्वारा एकत्र किए गए सभी संदेशों की एक सपाट सरणी मिलेगी। सरणी को डंप करने पर, हमें कुछ इस तरह मिलता है:


    सरणी(5) ( => स्ट्रिंग(29) "%s के लिए डेटा सत्यापन विफल" => स्ट्रिंग(60) "लॉगिन में केवल अक्षर (ए-जेड), अंक (0-9) और "-_"" => स्ट्रिंग होना चाहिए (25) "ईमेल वैध ईमेल होना चाहिए" => स्ट्रिंग(26) "पासवर्ड खाली नहीं होना चाहिए" => स्ट्रिंग(32) "सहमत विशेषता मौजूद होनी चाहिए" )

    आप संदेशों को अपने अनुसार बदल सकते हैं. शायद मैंने किसी तरह इस लाइब्रेरी को गलत समझा, लेकिन यह प्रक्रिया मुझे इतनी स्पष्ट नहीं लगी: आपको हैंडल किए गए अपवाद पर findMessages() विधि का उपयोग करने की आवश्यकता है, जिसमें आप संदेशों को विशेषताओं के लिए नहीं, बल्कि नियमों के लिए परिभाषित करते हैं।


    $ex->findMessages([ "userNameRule" => "उपयोगकर्ता नाम में दो शब्द होने चाहिए।", "alnum" => "हमें आपका लॉगिन पसंद नहीं है।", "ईमेल" => "आपको स्पष्ट रूप से पसंद नहीं है आप हमें अपना ई-मेल देना चाहते हैं।", "notEmpty" => "अच्छा, आपका पासवर्ड कहाँ है?", "सहमत" => "यह अफ़सोस की बात है कि आप असहमत हैं।" ]);

    मुझे नहीं पता कि क्या ग़लत है, लेकिन कुछ चीज़ें हैं जो मुझे अभी भी समझ नहीं आ रही हैं। उपरोक्त तरीके से नियमों को परिभाषित करने से हमें यही मिलता है:


    सरणी(5) (=>स्ट्रिंग(40) "उपयोगकर्ता नाम दो शब्द होना चाहिए।" => स्ट्रिंग(31) "हमें आपका लॉगिन पसंद नहीं है।" => स्ट्रिंग(25) "ईमेल वैध ईमेल होना चाहिए" = > स्ट्रिंग(5) "अच्छा, आपका पासवर्ड कहां है?" => स्ट्रिंग(9) "यह अफ़सोस की बात है कि आप सहमत नहीं हैं।"

    जैसा कि आप देख सकते हैं, ईमेल फ़ील्ड के लिए संदेश लागू नहीं किया गया था, मानक वाला ही बना रहा। लेकिन सूचकांक 4 पर संदेश इसके विपरीत है! और यह इस तथ्य के बावजूद है कि मैंने नियम के नाम का नहीं, बल्कि फ़ील्ड के नाम का उपयोग किया है। जबकि यदि मैंने नियम नाम (trueVal) का उपयोग किया होता, तो मेरा संदेश कहीं खो गया होता। इस लाइब्रेरी के अनुभवी उपयोगकर्ताओं की टिप्पणियों का बहुत स्वागत है।

    सीरियस सत्यापन

    ठीक है, चलिए अगली लाइब्रेरी पर चलते हैं और देखते हैं कि यह समान कार्यों को कैसे संभालती है।

    नियमों को परिभाषित करना

    एक बार फिर हमें उपयोगकर्ता नाम के लिए एक नियम परिभाषित करने की आवश्यकता है। हम इसे कुछ इस तरह लिखेंगे:


    वर्ग UserNameRule AbstractRule का विस्तार करता है ( // त्रुटि संदेश const MESSAGE = "उपयोगकर्ता नाम दो शब्द होना चाहिए।"; const LABELED_MESSAGE = "(लेबल) दो शब्द होना चाहिए।"; सार्वजनिक फ़ंक्शन सत्यापन ($ मूल्य, $ valueIdentifier = null ) ( वापसी (बूल) preg_match("/^+\s+$/u", $value ) )

    कृपया पहले से चर्चा की गई पुस्तकालयों की तुलना में दृष्टिकोण में अंतर पर ध्यान दें। हम गुणों, विधियों या नियम तर्कों का उपयोग करने के बजाय स्थिरांक में दो प्रकार के संदेशों को परिभाषित करते हैं।


    आइए अब सत्यापन तर्क का वर्णन करें:


    $सत्यापनकर्ता = नया सत्यापनकर्ता; $validator ->add("name", "required | MyApp\Validation\Rule\UserNameRule") ->add("login", "required | alphanumhyphen", null, "लॉगिन में केवल लैटिन अक्षर, डैश और अंडरस्कोर हो सकते हैं। ") ->जोड़ें("ईमेल", "आवश्यक | ईमेल", शून्य, "कृपया एक सही ईमेल दर्ज करें।") ->जोड़ें("पासवर्ड", "आवश्यक | अधिकतम लंबाई(64)", शून्य, "आपका पासवर्ड, सर।") ->जोड़ें("सहमत", "आवश्यक | बराबर(सही)", शून्य, "आप सहमत क्यों नहीं हुए?");

    जैसा कि आप देख सकते हैं, नियमों का सेट बहुत सरल और पठनीय है। विवरण के लिए, हम क्षैतिज पट्टियों द्वारा अलग किए गए नामों का उपयोग करते हैं। यह दृष्टिकोण लारवेल और कॉन्ट्रोलियो में उपयोग किए गए दृष्टिकोण के समान है।


    ऐड() विधि का चौथा तर्क सत्यापन त्रुटि संदेश का वर्णन करता है जिसे सत्यापन विफल होने पर सिरियस उपयोग करेगा। हमने अपने नए नियम के लिए कोई संदेश क्यों नहीं जोड़ा? उपयोगकर्ता नाम नियम?


    $सत्यापनकर्ता->जोड़ें("नाम", "आवश्यक | MyApp\Validation\Rule\UserNameRule")

    ऐसा इसलिए है क्योंकि संदेश पहले से ही वर्ग स्थिरांक में वर्णित हैं:


    वर्ग UserNameRule AbstractRule का विस्तार करता है ( // त्रुटि संदेश const MESSAGE = "उपयोगकर्ता नाम दो शब्दों का होना चाहिए।"; ...

    एक अन्य विकल्प सत्यापनकर्ता की addMessage() विधि का उपयोग करना है:


    $validator->addMessage('ईमेल', 'कृपया एक वैध ईमेल दर्ज करें');

    कृपया ध्यान दें कि कस्टम नियमों की पहचान उनके वर्ग के पूरे नाम से की जाती है, जबकि कॉन्ट्रोलियो में आप उपनाम/उपनाम निर्दिष्ट कर सकते हैं।

    प्रतिक्रिया

    सत्यापन करने के लिए, हम सत्यापनकर्ता विधि वैध() को कॉल करते हैं, इसमें डेटा पास करते हैं:


    $डेटा = [ "नाम" => "अल्बर्ट", // दो शब्द होने चाहिए "लॉगिन" => "@lbert", // "निषिद्ध" वर्ण @ "ईमेल" => "कुछ गलत", // होना चाहिए यहां एक ई-मेल भेजें "पासवर्ड" => "" // पासवर्ड बिल्कुल निर्दिष्ट नहीं है // "सहमत" सरणी में नहीं है क्योंकि उपयोगकर्ता ने बॉक्स को चेक नहीं किया है]; $सत्यापनकर्ता->सत्यापन($डेटा);

    रेस्पेक्ट के विपरीत, सीरियस कोई अपवाद नहीं फेंकेगा, बल्कि बस वापस लौट आएगा असत्य. सत्यापन त्रुटि संदेश getMessages() सत्यापनकर्ता विधि के माध्यम से प्राप्त किए जा सकते हैं। यह विशेषताओं द्वारा समूहीकृत त्रुटियों को लौटाता है, इसलिए त्रुटियों से गुजरने के लिए हमें दो फ़ोरैच लूप की आवश्यकता होती है:


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

    यहां $message एक क्लास ऑब्जेक्ट है सिरियस\मान्यता\त्रुटिसंदेश, जिसमें एक getTemplate() विधि है जो हमें आवश्यक संदेश लौटाती है।

    वैलिट्रॉननियमों को परिभाषित करना

    पहला अंतर: एक नया नियम जोड़ने के लिए, आपको एक अलग वर्ग बनाने की आवश्यकता नहीं है। आप बस एक क्लोजर का उपयोग कर सकते हैं जो बूलियन परिणाम लौटाता है।


    कस्टम नियम जोड़ने के लिए, वैलिट्रॉन के पास एक स्थिर विधि addRule() है, जिसमें पहले दो तर्क आवश्यक हैं, और तीसरा वैकल्पिक है। मुझे यह तरीका पसंद आया, क्योंकि यह नियम पहचानकर्ता, तर्क और त्रुटि संदेश एक ही स्थान पर दिखाता है।


    वैलिट्रॉन\Validator का उपयोग करें; Validator::addRule("two_words", function($field, $value) ( ​​​​ return (bool) preg_match("/^+\s+$/u", $value); ), "उपयोगकर्ता नाम बिल्कुल सही होना चाहिए दो शब्द ");

    दूसरा अंतर यह है कि नियमों को विशेषताओं पर कैसे लागू किया जाता है। पिछले सभी मामलों में, हमने देखा कि एक विशेषता, जैसे वह थी, एक प्राथमिक चीज़ है।


    वैलिट्रॉन ने एक अलग रास्ता अपनाया और सत्यापन नियम पहले रखे। नियमों का वर्णन करके, आप इन नियमों में विशेषताएँ लागू करते प्रतीत होते हैं, न कि इसके विपरीत।


    $सत्यापनकर्ता = नया सत्यापनकर्ता($डेटा); $ सत्यापनकर्ता -> नियम ("दो_शब्द", "नाम") -> लेबल ("") -> नियम ("आवश्यक", ["नाम", "लॉगिन", "ईमेल", "पासवर्ड", "सहमत" ] ) ->नियम('स्लग', 'लॉगिन') ->नियम('ईमेल', 'ईमेल') ->नियम('स्वीकृत', 'सहमत');

    जैसा कि उदाहरण से देखा जा सकता है, नियम() विधि में हम पहले नियम का नाम लिखते हैं, और उसके बाद ही उन विशेषताओं को इंगित करते हैं जो इस नियम के अनुरूप होनी चाहिए। एक अधिक स्पष्ट उदाहरण आवश्यक नियम है, जो दर्शाता है कि विशेषताएँ उस नियम से कैसे "संबंधित" हैं।


    वैलिट्रॉन (अन्य समाधानों की तरह जिनकी हमने समीक्षा की है) मानक त्रुटि संदेश प्रदान करता है। यदि आप बस उनका उपयोग करते हैं, तो आप देखेंगे कि प्रत्येक संदेश संबंधित विशेषता के नाम से शुरू होता है।


    गैर-मानक त्रुटि संदेशों का उपयोग किए जाने पर भी वैलिट्रॉन संदेश पाठ में विशेषता नामों को प्रतिस्थापित करता है। इसीलिए हमने विशेषता नाम को हटाने के लिए एक खाली स्ट्रिंग के साथ लेबल() विधि का उपयोग किया।


    $सत्यापनकर्ता->नियम("दो_शब्द", "नाम")->लेबल("") प्रतिक्रिया

    विशेष रूप से सत्यापन के संबंध में, वैलिट्रॉन लाइब्रेरी एपीआई व्यावहारिक रूप से उस चीज़ से अलग नहीं है जो हमने पहले ही लेख में देखी है। सत्यापन करने के लिए हम सत्यापनकर्ता विधि को मान्य() कहते हैं:


    $सत्यापनकर्ता->सत्यापन();

    सत्यापन त्रुटि संदेशों को getErrors() विधि का उपयोग करके पुनर्प्राप्त किया जा सकता है:


    $सत्यापनकर्ता->त्रुटियाँ();

    यहां संदेशों को सीरियस वैलिडेशन की तरह ही विशेषताओं द्वारा समूहीकृत किया गया है, सिवाय इसके कि संदेश के लिए कोई अलग वर्ग नहीं है, और हमें एक नियमित बहु-आयामी सरणी मिलती है।


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

    और अंत में, आज की आखिरी लाइब्रेरी मेरा अपना विकास है जिसे कॉन्ट्रोलियो कहा जाता है।

    नियमों को परिभाषित करना

    फिर से, पांचवीं बार, हम उपयोगकर्ता नाम के लिए एक सत्यापन नियम बनाएंगे। सब कुछ अपेक्षाकृत सरल और मानक है:


    नेमस्पेस MyProject\Validation\Rules; कॉन्ट्रोलियो\नियम\सार नियम का उपयोग करें; क्लास टूवर्ड्स Kontrolio\Rules\AbstractRule का विस्तार करता है (सार्वजनिक फ़ंक्शन isValid($input = null) ( return (bool) preg_match("/^+\s+$/u", $input); ) )

    अब हम एक फ़ैक्टरी बनाते हैं और उसमें विस्तार() विधि का उपयोग करके एक नियम पंजीकृत करते हैं:


    नेमस्पेस मायप्रोजेक्ट; कॉन्ट्रोलियो\फ़ैक्टरी का उपयोग करें; MyProject\Validation\Rules\TwoWords का उपयोग करें; $फ़ैक्टरी = कॉन्ट्रोलियो\फ़ैक्टरी::getInstance()->extend();

    नियम को पंजीकृत करने के बाद, हम इसका उपयोग कर सकते हैं, जिसमें नाम भी शामिल है - दो_शब्द। आइए एक सत्यापनकर्ता बनाएं:


    $डेटा = [ "नाम" => "अल्बर्ट", // दो शब्द होने चाहिए "लॉगिन" => "@lbert", // "निषिद्ध" वर्ण @ "ईमेल" => "कुछ गलत", // होना चाहिए यहां एक ई-मेल भेजें "पासवर्ड" => "" // पासवर्ड बिल्कुल निर्दिष्ट नहीं है // "सहमत" सरणी में नहीं है क्योंकि उपयोगकर्ता ने बॉक्स को चेक नहीं किया है]; $नियम = ["नाम" => "दो_शब्द", "लॉगिन" => "कभी-कभी|अल्फाडैश", "ईमेल" => "ईमेल", "पासवर्ड" => "लंबाई:1.64", "सहमत" => " स्वीकृत" ]; $messages = [ "नाम" => "उपयोगकर्ता नाम में दो शब्द होने चाहिए।", "लॉगिन" => "हमें आपका लॉगिन पसंद नहीं है।", "ईमेल" => "आप स्पष्ट रूप से देना नहीं चाहते हैं हमें आपका ईमेल।", "पासवर्ड" => "अच्छा, आपका पासवर्ड कहाँ है?", "सहमत" => "यह अफ़सोस की बात है कि आप सहमत नहीं हैं।" ]; $सत्यापनकर्ता = $फैक्टरी->बनाना($डेटा, $नियम, $संदेश);

    हमने लारवेल में उपयोग किए गए वाक्यविन्यास के समान एक वाक्यविन्यास का उपयोग करके नियमों का वर्णन किया, हालांकि हम अधिक क्रियात्मक संस्करण का उपयोग कर सकते थे:


    $नियम = ["नाम" => नए दो शब्द, "लॉगिन" => , "ईमेल" => नया ईमेल, "पासवर्ड" => नई लंबाई(1, 64), "सहमत" => नया स्वीकृत ]; प्रतिक्रिया

    सत्यापन उसी मान्य() विधि का उपयोग करके शुरू किया गया है:


    $सत्यापनकर्ता->सत्यापन();

    अब हम getErrors() या getErrorsList() तरीकों में से किसी एक का उपयोग करके त्रुटि संदेश प्राप्त कर सकते हैं। पहली विधि अधिक जटिल त्रुटि आउटपुट की अनुमति देती है, जबकि दूसरी एक सपाट सरणी लौटाती है। GetErrors() का उपयोग करके हम संदेशों को कुछ इस तरह आउटपुट कर सकते हैं:



    और getErrorsList() से आप संदेशों की एक सरल सूची बना सकते हैं:


    जमीनी स्तर

    इस लेख में मैंने निम्नलिखित पुस्तकालयों के उपयोग के उदाहरण दिखाए हैं:

  • आभा.फ़िल्टर
  • मान्यता का सम्मान करें
  • सीरियस सत्यापन
  • वैलिट्रॉन
  • नियंत्रण
  • एक "वास्तविक दुनिया का उदाहरण" बहुत सरल लग सकता है। मुझे सहमत होना होगा, क्योंकि, वास्तव में, कुछ पुस्तकालय क्षमताओं को लेख से बाहर रखा गया था। सिद्धांत रूप में, यदि आप रुचि रखते हैं, तो आप स्वयं उनकी विशेषताओं का अध्ययन कर सकते हैं।


    प्रत्येक पुस्तकालय की अपनी विशेषताएं हैं और उसके कुछ स्याह पक्ष भी हैं, इसलिए मुझे लगता है कि किसी एक को चुनना स्वाद और चुनौती का मामला है।


    पढ़ने के लिए धन्यवाद। सही चुनाव करो।

    वापस बुलाओ।

    • इस प्रकार का नियम कॉन्ट्रोलियो के क्लोजर के समान है। यह आपको किसी नियम को समापन के रूप में परिभाषित करने की अनुमति देता है। इस समापन के लिए, Aura.Filter "विषय", फ़ॉर्म से हमारे डेटा की सरणी और एक फ़ील्ड को पास करता है, इस मामले में सहमत है।
    • टैग:
    • आंकड़ा मान्यीकरण
    पीएचपी