क्या दृश्य को सत्यापन नहीं करना चाहिए?


10

मैं पढ़ रहा था " एमवीसी में एक मॉडल को सत्यापन को संभालना चाहिए? " क्योंकि मैं उत्सुक था कि एमवीसी वेबसाइट में सत्यापन तर्क कहां जाना चाहिए। शीर्ष उत्तर में एक पंक्ति इस प्रकार है: "नियंत्रकों को सत्यापन को संभालना चाहिए, मॉडल को सत्यापन को संभालना चाहिए।"

मुझे वह पसंद आया, लेकिन इसने मुझे यह सोच कर छोड़ दिया कि हम दृश्य में डेटा सत्यापन क्यों नहीं करेंगे, कई कारणों से:

  1. दृश्य में आम तौर पर मजबूत सत्यापन समर्थन होता है (जेएस लाइब्रेरी, एचटीएमएल 5 टैग)
  2. दृश्य स्थानीय रूप से मान्य हो सकते हैं, नेटवर्क IO को कम कर सकते हैं
  3. यूआई पहले से ही डेटा-प्रकार को ध्यान में रखते हुए बनाया गया है (तारीखों के लिए कैलेंडर, संख्याओं के लिए स्पिनर), यह सत्यापन से एक छोटा कदम है।

एक से अधिक स्थानों पर मान्य करना MVC की जिम्मेदारियों को अलग करने की अवधारणा के विपरीत है, इसलिए "इसे दोनों में करें" अनुचित लगता है। क्या डेटा सत्यापन केवल नियंत्रक में ही सही है?


यहाँ मुद्दा गलत द्वंद्वात्मकता में से एक हो सकता है: ऐसा कोई कारण नहीं है कि आप कई स्थानों पर सत्यापन नहीं कर सकते हैं, और इस स्थिति को "या तो-या-नहीं-दोनों" के रूप में सोच रहे हैं, इस प्रश्न के बारे में आपके विचार (दंड!) पर विचार कर सकते हैं। । उदाहरण के लिए, किसी वेबसाइट में क्लाइंट-साइड वेलिडेशन के कुछ रूप करना, वास्तव में उपयोगी हो सकता है क्योंकि उपयोगकर्ताओं को त्वरित प्रतिक्रिया मिलती है, लेकिन यह भी भरोसेमंद नहीं है, इसलिए यह एकमात्र सत्यापन नहीं हो सकता है।
माइल राउत

जवाबों:


10

मुझे नहीं लगता कि कोई एकल स्थान है जहां आप कह सकते हैं कि सभी सत्यापन को जाना चाहिए। इसका कारण यह है कि हमारे पास मानक asp.net mvc वेबसाइट में एक साथ काम करने वाली कुछ अलग प्रतिस्पर्धी प्रोग्रामिंग रणनीतियाँ हैं।

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

फिर, हम क्लाइंट साइड जावास्क्रिप्ट का उपयोग करके व्यू बढ़ाते हैं। यह इन दिनों इतना उन्नत है कि Jquery / knockout / कोणीय के साथ 'एक पृष्ठ वेबसाइट' का विचार आम बात है।

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

यह एक बेहतर उपयोगकर्ता अनुभव दे सकता है, लेकिन आपको अनिवार्य रूप से अविश्वसनीय ग्राहक पर भरोसा करना होगा। तो आपको अभी भी सर्वर पर सत्यापन तर्क को पूरा करने की आवश्यकता है, भले ही आपका ग्राहक अपने अनुरोधों को पूर्व-मान्य करता हो।

इसके अलावा, हमारे पास अक्सर सत्यापन आवश्यकताएं होती हैं जो ग्राहक द्वारा नहीं की जा सकती हैं। जैसे। 'क्या मेरी नई आईडी अद्वितीय है?'

सबसे अच्छा अनुभव / प्रदर्शन देने के लक्ष्य के साथ आपके द्वारा बनाया गया कोई भी एप्लिकेशन आवश्यक रूप से कई प्रोग्रामिंग प्रतिमानों के लिए उधार लेगा और अपने लक्ष्य को प्राप्त करने के लिए उन पर समझौता करेगा।


4
+1 और ज़ोर देने के लिए: कभी भी क्लाइंट द्वारा पोस्ट किए गए डेटा पर भरोसा न करें। कभी।
मचादो

मैंने इसे कैसे पढ़ा: "सत्यापन एक अलग अवधारणा नहीं है - आपके आवेदन के सभी हिस्सों को अलग-अलग संदर्भों में एक दूसरे के खिलाफ मान्य होने की आवश्यकता है।" ज्यादा काम करने पर भी समझ में आता है।
WannabeCoder

हां, लेकिन यह भी: "आपके पास दो (या अधिक) एप्लिकेशन हो सकते हैं, सभी अलग-अलग पैटर्न का अनुसरण कर रहे हैं"
इवान

" मांद · मैं · आभार : गलत तरीके से आलोचना करना; निराशा। " मुझे नहीं लगता कि आप उस शब्द का सही उपयोग कर रहे हैं। अच्छा जवाब अन्यथा, हालांकि।
kdbanman

नहीं, यही मेरा मतलब है
इवान

1

एक से अधिक स्थानों पर मान्य करना MVC की जिम्मेदारियों को अलग करने की अवधारणा के विपरीत है, इसलिए "इसे दोनों में करें" अनुचित लगता है।

क्या यहां विचार करने के लिए कई सत्यापन जिम्मेदारियां हो सकती हैं? जैसा कि आपने अपने # 3 में कहा:

यूआई पहले से ही डेटा-प्रकार को ध्यान में रखते हुए बनाया गया है (तारीखों के लिए कैलेंडर, संख्याओं के लिए स्पिनर), यह सत्यापन से एक छोटा कदम है।

तो शायद यह है:

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

मॉडल : डेटा की व्यावसायिक चिंताओं को मान्य करें। क्या यह व्यावसायिक नियमों के अनुसार कानूनी मूल्य है? हां, यह एक संख्यात्मक मूल्य है (हमने यह सुनिश्चित किया है कि दृश्य में), लेकिन क्या इसका कोई मतलब है?

सिर्फ एक विचार।


1

मैं मानने जा रहा हूं कि आपको दृढ़ता के लिए सत्यापन की आवश्यकता है।

न केवल देखें, बल्कि मॉडल को सत्यापन भी नहीं करना चाहिए। आईटी में मेरे दिनों के दौरान मुझे एहसास हुआ कि DDD यह सुनिश्चित करने का एक तरीका है कि आप वास्तव में चीजों को सही तरीके से कर रहे हैं, यानी। कक्षाएं वास्तव में वे क्या होना चाहिए के लिए जिम्मेदार हैं।

Domain-Driven डिज़ाइन का पालन करते समय, आपके मॉडल में आपके व्यावसायिक तर्क शामिल होते हैं, और वह यह है। लेकिन उनमें सत्यापन शामिल नहीं है, क्यों नहीं?

मान लेते हैं कि आप पहले से ही अपने डोमेन परत को बनाए रखने के Data Mapperबजाय इसका उपयोग कर रहे हैं Active Record। लेकिन फिर भी, आप मॉडल को मान्य करना चाहते हैं, इसलिए आप अपने मॉडल में सत्यापन जोड़ते हैं।

interface Validation
{
    public function validate();
}

class ConcreteModel extends MyModel implements Validation
{
    public function validate() { // the validation logic goes here }
}

सत्यापन तर्क सुनिश्चित करता है, आप अपने MySQL डेटाबेस में मॉडल को सही ढंग से सम्मिलित कर सकते हैं ... कुछ महीने गुजरते हैं और आप तय करते हैं, आप अपने मॉडल को noSQL डेटाबेस में भी संग्रहीत करना चाहते हैं, डेटाबेस, जिन्हें MySQL से भिन्न सत्यापन नियमों की आवश्यकता होती है।

लेकिन आपको एक समस्या है, आपके पास केवल 1 सत्यापन विधि है, लेकिन Model2 अलग-अलग तरीकों से मान्य करने की आवश्यकता है।

मॉडल को वही करना चाहिए जो वे करने के लिए जिम्मेदार हैं , उन्हें आपके व्यवसाय तर्क का ध्यान रखना चाहिए और इसे अच्छी तरह से करना चाहिए। सत्यापन हठ से बंधा है, न कि व्यापारिक तर्क से, इसलिए मान्यता एक मॉडल से संबंधित नहीं है

आपको Validatorइसके बजाय s बनाना चाहिए , जो उनके निर्माता में एक पैरामीटर के रूप में मान्य करने के लिए एक मॉडल लेगा, Validationइंटरफ़ेस को लागू करेगा और Validatorअपनी वस्तुओं को मान्य करने के लिए इन s का उपयोग करेगा ।

interface Validation
{
    public function validate();
}

class MySQLConcreteModelValidator implements Validation
{
    public function __construct(ConcreteModel $model) { }

    public function validate()
    {
        // you validate your model here
    }
}

class RedisConcreteModelValidator implements Validation
{
    public function __construct(ConcreteModel $model) { }

    public function validate()
    {
        // you validate your model with different set of rules here
    }
}

यदि भविष्य में किसी भी समय आप एक और दृढ़ता परत के लिए एक और सत्यापन विधि जोड़ना चाहते हैं (क्योंकि आपने फैसला किया है कि Redis और MySQL अब और जाने का रास्ता नहीं है), तो आप बस एक Validatorऔर निर्माण करेंगे और अपने IoCकंटेनर का उपयोग करके सही उदाहरण प्राप्त करेंगे अपने पर config


1

कई डेवलपर्स के लिए, स्टूपिड अग्ली कंट्रोलर्स के खिलाफ फैट मॉडल पसंदीदा तरीका है।

पाठ में आधार अवधारणा है

... इसलिए हमेशा याद रखें कि मॉडल सिर्फ डेटाबेस नहीं है। यहां तक ​​कि वेब सेवाओं से प्राप्त डेटा को एक मॉडल के रूप में व्यक्त किया जा सकता है! हाँ, एटम भी खिलाता है! फ्रेमवर्क जो मॉडल के लिए परिचय को रोकते हैं, लगभग कभी भी इस उलट की व्याख्या नहीं करते हैं जो केवल गलतफहमी को बढ़ाता है।

तथा

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

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

किसी व्यक्ति का रिकॉर्ड लेते समय, प्रत्येक व्यक्ति के पास देश द्वारा दिया गया एक विशिष्ट आईडी नंबर होना चाहिए। यह चेक (आम तौर पर) UNIQUEडेटाबेस द्वारा मुख्य चेक द्वारा किया जाता है। प्रत्येक दिए गए आईडी नंबर को कुछ नियंत्रण चरणों को संतुष्ट करना चाहिए (विषम अंकों का योग सम अंकों आदि के योग के बराबर होना चाहिए)। इस प्रकार के नियंत्रणों द्वारा किया जाना चाहिएModel

नियंत्रक डेटा एकत्र कर रहा है Modelऔर इसे पास Viewया रिवर्स करने के लिए उपयोगकर्ता डेटा एकत्र कर रहा है Viewऔर इसे पास कर सकता है Model। डेटा तक पहुँचने और इसे मान्य करने का कोई प्रतिबंध नहीं होना चाहिए Controller। यह Controllerकुकी डेटा एकत्र करने वाला व्यक्ति था और यह Modelजाँच करता था कि क्या यह एक वैध सत्र है या उपयोगकर्ता के पास आवेदन के इस हिस्से तक पहुँच है।

Viewउपयोगकर्ता इंटरफ़ेस है जो उपयोगकर्ता से डेटा एकत्र करता है या उपयोगकर्ता को डेटा प्रस्तुत करता है। सरल जांच Viewउपयोगकर्ता इनपुट ई-मेल पते की तरह किया जा सकता है या नहीं (इस प्रकार यह दृश्य में भी किया जा सकता है) IMO।

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


केवल जोर देने के लिए, केवल UI के साथ संबंध रखने वाला दृश्य का मतलब यह नहीं है कि यह सत्यापन के कुछ प्रकार नहीं कर सकता है - उपयोगकर्ताओं को तत्काल प्रतिक्रिया प्रदान करना जब वे गलती करते हैं तो वास्तव में क्लाइंट-साइड स्क्रिप्टिंग का एक महत्वपूर्ण हिस्सा है उपयोगी, वेबसाइटों के लिए लागू एमवीसी के संदर्भ में।
माइल्स राउत

@ माइल्सआउट वास्तव में मेरा मतलब है कि Simple checks can be done by the View like the user input e-mail address or not शायद यह स्पष्ट नहीं है। लेकिन आपने जो कहा वह मेरे लिए भी सही है, सरल और आसान जाँच को आसानी से देखा जा सकता है।
फॉलनएंगल

मैं आपसे असहमत नहीं था।
मील्स रुट

0

दृश्य एफएफ प्रयोजनों के लिए सत्यापन करना चाहिए:

  1. ) एक फ्रंट एंड सत्यापन आपके सर्वर में डेटा ट्रैफ़िक को कम कर सकता है।
  2. ) यह आपके सर्वर में यात्रा करने से पहले अमान्य डेटा को संभालता है।
  3. ) यदि आप उच्च सुरक्षा चाहते हैं, तो फ्रंट एंड और बैक एंड वैलिडेशन का संयोजन बेहतर है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.