2010-01-15 16 views
20

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

+0

सरल जवाब: [। रख दिया जहां यह आवश्यक है] (http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/02/15/validation-in-a-ddd-world.aspx) –

उत्तर

12

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

इस at joelonsoftware की एक दिलचस्प चर्चा है।

+0

यह सी ++ में एक वेब ढांचा है, कोई जावास्क्रिप्ट आवश्यक नहीं है। –

+0

मुझे लगता है कि ऐप में कहीं कुछ जावास्क्रिप्ट है? जब तक यह एक पुरानी शैली वाली वेब-शैली वाली वेब ऐप या ढांचा नहीं है। –

+0

वहाँ है लेकिन मैं इसे तब तक स्पर्श/कोड/संभाल नहीं लेता जब तक कि मैं वास्तव में वास्तव में वास्तव में नहीं चाहता :) इस ढांचे में दृश्य केवल विजेट बनाता है और प्रारंभ करता है और उन्हें रूट विजेट से जोड़ता है। हालांकि इसमें सत्यापन कार्य हो सकता है। तो दृश्य मान्य है कि डेटा खाली नहीं है, लेकिन मॉडल यह सत्यापित करने के लिए है कि इनपुट उपयोगकर्ता नाम और पासवर्ड सही हैं? –

0

इसका व्यावसायिक तर्क, इसलिए नहीं, यह मॉडल में शामिल नहीं है।

+0

नीचे दिए गए उत्तर अन्यथा दावा करते हैं। कृपया विस्तृत करें और समझाएं कि आप ऐसा क्यों सोचते हैं। –

+1

मैं शायद नीचे उल्लिखित मार्ग डारन जाना होगा। इस मामले में, यह आपकी सेवा परत में जाएगा। मूल रूप से, इस तरह के बारे में सोचें; एक खाली स्ट्रिंग को मॉडल द्वारा आपके ऊपर रखी गई बाधा की अनुमति नहीं दे रहा है? और यह यूआई चिंता नहीं है। तो यह एक व्यापार चिंता होना चाहिए; कोई उपयोगकर्ता खाली उपयोगकर्ता नाम से लॉग इन नहीं कर सकता है। – brian

+2

उह। यदि मॉडल में एमवीसी ठीक से व्यवसाय तर्क है, तो दृश्य या नियंत्रक नहीं। एप्लिकेशन तर्क नियंत्रक में आता है, और दृश्य दृश्य है। तर्कसंगत सत्यापन व्यापार तर्क नहीं है बल्कि एप्लिकेशन तर्क है, लेकिन यह अलग-अलग बाल हैं। – Shayne

-3
Business Logic -> Controller 
Data Validation -> Model 
+0

उपर्युक्त उत्तर का कहना है कि यह व्यवसाय तर्क है इसलिए यह मॉडल से संबंधित नहीं है। आप कह रहे हैं कि यह सही है? मैं उलझन में हूँ। कृपया विस्तृत करें और समझाएं कि आप ऐसा क्यों सोचते हैं। –

+2

मैं असहमत हूं। मैं कहूंगा: व्यापार तर्क -> डोमेन; उपयोगकर्ता इंटरफ़ेस तर्क -> नियंत्रक; प्रमाणीकरण -> डोमेन + यूआई (वैकल्पिक) –

+0

@the_drow: मैं कह रहा हूं कि व्यापार तर्क ** ** मॉडल में नहीं है, यह नियंत्रक में है। –

0

नियंत्रक के भीतर आप ModelState संपत्ति के लिए आप के लिए सत्यापन त्रुटियों जोड़ सकते हैं जो की है।

this example on the MSDN देखें।

0

आपके आवेदन मानते हुए की तरह संरचित है:

  • मॉडल-व्यू-नियंत्रक
  • सेवा
  • हठ
  • मॉडल

उपयोगकर्ता इनपुट, अपने नियंत्रक करने के लिए आते हैं और आप इसे सत्यापित करने के लिए सेवा परत में सेवाओं का उपयोग करेंगे।

+1

अधिक परतें? सेवा परत क्या है?कोई डेटाबेस नहीं है इसलिए कोई दृढ़ता नहीं है, सभी डेटा किसी अन्य प्रक्रिया से लिया जाता है और सभी डेटा या तो यूआई या प्रक्रिया से बदला जाता है। –

6

मैं लंबे समय तक इस बारे में सोच रहा हूं और दोनों नियंत्रकों और मॉडलों में सत्यापन डालने की कोशिश करने के बाद .... अंततः मैं इस निष्कर्ष पर आया हूं कि मेरे कई अनुप्रयोगों के लिए ... सत्यापन मॉडल में है और नियंत्रक में नहीं। क्यूं कर? क्योंकि भविष्य में एक ही मॉडल विभिन्न अन्य नियंत्रक कॉल या एपीआई द्वारा उपयोग किया जा सकता है ... और फिर मुझे सत्यापन प्रक्रिया को बार-बार दोहराना होगा। वह डीआरवाई का उल्लंघन करेगा और कई त्रुटियों का कारण बन जाएगा। इसके अलावा दार्शनिक रूप से यह मॉडल जो डेटाबेस (या अन्य लगातार भंडारण) के साथ इंटरैक्ट करता है और इस तरह वैसे भी ऐसा करने के लिए 'अल्कोहल के लिए अंतिम कॉल' जगह है।

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

1

मान्यता केवल मॉडल जानता कारोबार का "विवरण" मॉडल

में होना चाहिए। केवल मॉडल जानता है कि कौन सा डेटा स्वीकार्य है और कौन सा डेटा नहीं है। नियंत्रक बस जानता है कि मॉडल का "उपयोग" कैसे करें।

उदाहरण के लिए: मान लें कि हमें अपने सिस्टम में नए उपयोगकर्ताओं को पंजीकृत करने की कार्यक्षमता की आवश्यकता है।

मॉडल:

public function registerUser(User $user){ 
    //pseudo code 
     //primitive validation 
     if(!isInt($user->age)){ 
      //log the invalid input error 
      return "age"; 
     } 
     if(!isString($user->name)){ 
      //log the invalid input error 
      return "name"; 
     } 
     //business logic validation 

     //our buisnees only accept grown peoples 
     if($user->age < 18){ 
      //log the error 
      return "age"; 
     } 
     //our buisness accepts only users with good physique 
     if($user->weight > 100){ 
      //log the error 
      return "weight"; 
     } 
     //ervery thing is ok ? then insert the user 
     //data base query (insert into user (,,,) valeues (?,?,?,?)) 
     return true; 
} 

अब नियंत्रक/s काम कैसे मॉडल सत्यापन करने जा रहा है, या यहाँ तक कि क्या माना जाता है "वैध के ज्ञान के बिना मॉडल registerUser() समारोह" का उपयोग "करने के लिए है " या नहीं!

नियंत्रक:

$user = new User(); 
$user->age = isset($_POST['age']) ? $_POST['age'] : null; 
$user->name = isset($_POST['name']) ? $_POST['name'] : null; 
$user->age = isset($_POST['weight']) ? $_POST['weight'] : null; 
$result = $theModel->registerUser($user);// <- the controller uses the model 
if($result === true){ 
//build the view(page/template) with success message and die 
} 
$msg = ""; 
//use the return value from the function or you can check the error logs 
switch ($result){ 
    case"age" : 
     $msg = "Sorry, you must be over 18"; 
     break; 
    case "name": 
     $msg = "name field is not correct"; 
     break; 
    case "weight": 
     $msg = "Sorry, you must have a good physique"; 
     break; 
} 
//build the view(page/template) with error messages and die 

वर्ग उपयोगकर्ता

class User { 
    public $age; 
    public $name; 
    public $weight; 
} 

होने की तरह है कि "मुक्त" पूरी तरह से व्यापार तर्क का ब्यौरा -which एक अच्छा बात है से नियंत्रकों होगा एक वास्तुकला ।

मान लीजिए कि हमें (और हम एक और नियंत्रक इसके लिए आवंटित होगा) उपयोगकर्ता पंजीकरण कहीं और वेबसाइट में का एक और रूप बनाना चाहते हैं। अब अन्य नियंत्रक मॉडल registerUser() के उसी विधि का उपयोग करेगा।

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

संबंधित मुद्दे