2012-02-12 12 views
9

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

+1

आम तौर पर, मैं @ सिप्लु से सहमत हूं कि सवाल बहुत व्यापक है। हालांकि, मुझे लगता है कि यह वास्तव में कुछ सकारात्मक उत्तरों में हुआ, इसलिए यह सिर्फ एक बार उपयोगी है। मैं यात्रियों द्वारा सुझाए गए कुछ अलग उत्तरों की जांच करके सुझाव दूंगा। – rdlowrey

+0

विभिन्न उत्तरों की संख्या दिलचस्प है। तो मुझे अच्छा सवाल लगता है। व्यक्तिगत रूप से मुझे लगता है कि इसमें से अधिकांश परियोजना की सादगी और टीम में संसाधन की मात्रा पर निर्भर करता है। मुझे लगता है कि बहुत सारे डेवलपर मॉडल के लिए तेजी से काम कर रहे हैं, ui। और कुछ कंपनियों में विनिर्देश तार-फ्रेम या HTML होंगे।मुझे संदेह है कि एक सही जवाब है। – Gavin

उत्तर

11

मॉडल क्योंकि यह आपका आवेदन है। नियंत्रक और मॉडल के लिए केवल एक इंटरफ़ेस देखें। कोई कह सकता है, नियंत्रक आपके घर का दरवाजा है। आप पहले क्या बनाते हैं? दरवाजा या घर? ठीक है, तो पहले मॉडल का निर्माण करें। फिर इसमें एक इंटरफेस जोड़ें।

+0

+1 इस प्रकार हम 'आम तौर पर' काम करते हैं, मुझे लगता है कि यह एक बेहतर विकसित मॉडल/एपीआई की ओर जाता है, और टीडीडी सहायक करता है। कभी-कभी हम प्रक्रिया को तोड़ते हैं और शीर्ष पर काम करते हैं, आमतौर पर जब हमारे पास खराब परिभाषित आवश्यकताओं, या अत्यधिक हिस्सेदारी धारक भागीदारी और प्रदर्शन होते हैं। यह बैकलॉग को कई डेवलपर्स/डिजाइनरों में आसानी से अलग करने की इजाजत देता है iee backend/ui। – Gavin

0

नियंत्रक, आपको मॉडल और दृश्य के बीच संवाद करने की आवश्यकता है। नियंत्रक के बिना मॉडल दृश्य के साथ बातचीत नहीं कर सकता है।

0

आपको कंट्रोलर के साथ शुरू करना चाहिए क्योंकि यह व्यू कॉल कर रहा है।

यहां आप देख सकते हैं कि नियंत्रक मॉडल और व्यू के बीच मध्यवर्ती है। http://codeigniter.com/user_guide/overview/mvc.html

1

नियंत्रक आवश्यक है। क्योंकि आप नियंत्रक के बिना काम निष्पादित/निष्पादित नहीं कर सकते हैं। तो नियंत्रक पहले क्योंकि निम्न में से आता है,

  1. आप दृश्य को निष्क्रिय जब आवश्यक
  2. आप दृश्य के लिए प्रासंगिक चर नियंत्रक के माध्यम से
  3. मॉडल के साथ बातचीत नियंत्रक द्वारा कर रही है, तो सेट कर सकते हैं कर सकते हैं जब आप डेटा की आवश्यकता होती है नियंत्रक पहले
  4. आप उपयोगकर्ता को अन्य नियंत्रक
  5. पर रीडायरेक्ट कर सकते हैं आप अनुरोध के आधार पर अन्य दृश्य प्रदर्शित कर सकते हैं। कंप्यूटर के लिए ए देखें, और मोबाइल उपकरणों के लिए बी देखें, बुद्धिमान
  6. देखें प्रस्तुति है, इसलिए सबसे पहले आपको प्रस्तुत करने के लिए डेटा की आवश्यकता है।
7

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

  1. सीएसएस/छवि आदि
  2. क्या डेटा दृश्य मैं नियंत्रक तरीकों बनाने पर दिखाया जाता है पर निर्भर करता है के साथ एचटीएमएल टेम्पलेट बनाएँ।
  3. मैंने नियंत्रक विधियों में डमी डेटा डाला ताकि मैं एक गतिशील पृष्ठ देख सकूं जो दृश्य को सही तरीके से जोड़ता है।
  4. मेरे नियंत्रक की जरूरत डेटा के अनुसार मैं मॉडल विधि बनाता हूं।

इस प्रक्रिया में मैंने कभी भी कोई अतिरिक्त विधि या कोड ब्लॉक नहीं बनाया है। यह कोड जोड़ने से रोकता है जिसे हम आमतौर पर सोचते हैं "आवश्यक हो सकता है"। लेकिन उन्हें कभी जरूरत नहीं है।

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

+0

ऋण वोट की व्याख्या करने के लिए देखभाल? –

+0

+1 यह एक पूरी तरह से वैध शीर्ष नीचे दृष्टिकोण है। निश्चित रूप से अच्छी तरह से काम करता है जब सामने तर्क विनिर्देश या मॉडल डिज़ाइन गुम है/प्रयास के वैध उपयोग के रूप में नहीं माना जाता है। यह सब परिस्थिति और क्यूए आवश्यकताओं पर निर्भर करता है। कई अनुप्रयोगों के लिए शीर्ष पर काम करने के बाद कुछ भी आसान या तेज़ नहीं हो सकता है। – Gavin

+0

+1 पुराने दिनों में, जब हमने स्थिर पृष्ठों को प्रीपेर करने के लिए नोटपैड का उपयोग किया, तो हम सभी ने डिज़ाइन का पहला-एप्रेच इस्तेमाल किया। पुराने दिनों में यह सही समझ में आया हालांकि यह शायद व्यक्तिगत पसंद के आधार पर बहुत अधिक है। मेरा मानना ​​है कि यदि आप अपने आप पर एक परियोजना विकसित कर रहे हैं तो यह एक सही समझ में आता है। –

0

मैं मॉडल और नियंत्रक हाथ में हाथ कहूंगा।

मॉडल के बिना, आप कैसे जानेंगे कि नियंत्रक में प्रवाह क्या होगा?

नियंत्रक के बिना, आप कैसे जानेंगे कि मॉडल में किन तरीकों की आवश्यकता है?

कभी-कभी, मॉडल को प्राथमिकता मिलती है, कभी-कभी स्थिति के आधार पर नियंत्रक।

1

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

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

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

$view = new SmartyView; 
$model = new UserModel; 
$controller = new LoginController($view, $model); 

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

class LoginController 
{ 
    protected $view; 

    public function __construct(ViewInterface $view) 
    { 
    $this->view = $view; 
    } 
    public function doLogin($user, $pass) 
    { 
    $userModel = new UserModel(); 
    // do stuff with model to determine if user/pass was valid 
    } 
} 

$view = new SmartyView; 
$controller = new LoginController($view); 

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

+0

यह हिस्सा मुझे थोड़ा उलझन में डालता है। अनुरोध जीवन चक्र के दौरान नियंत्रण में प्रासंगिक जानकारी प्रदान करने के लिए आप कैसे समाप्त करेंगे? ' आप क्या वर्णन कर रहे हैं, सामान्यतया, एक रूटर/डिस्पैचर' $ route-> सेट ('/ uri// मैच के लिए', 'ControllerName', 'controlleraction') की तरह एक बहुत ही सरल कॉल करता है ऐसा कुछ ऐसा है जो एक बड़ी परियोजना में कोड के लिए बेहद कठिन होगा, जिसमें राउटर/प्रेषक को कुछ अज्ञात फ़ंक्शन लागू करना शामिल है जो उसके बाद नियंत्रक को पास करने से पहले तत्कालता को संभालता है। और क्या होगा यदि कोई मॉडल अन्य मॉडलों पर निर्भर करता है? – AgmLauncher

0

मुझे पता है कि यह पुराना सवाल हो सकता है, लेकिन अब मैं इसमें शामिल हो गया।
और किसी और को बाद में इसकी आवश्यकता हो सकती है। तो मैंने इसे संक्षेप में तय करने का फैसला किया।
मुझे लगता है कि आपका दृष्टिकोण स्थिति पर निर्भर करेगा।
आप कर आपरेशन के क्रम में इस मॉडल-व्यू-नियंत्रक
हो और यह फोन नीचे-से-शीर्ष दृष्टिकोण की सुविधा देता है करते हैं। इसके लिए केस और तर्क @Gordon here द्वारा प्रदान किया जाता है।
और एक और मामला इसे यूआई के साथ शुरू करते समय शीर्ष-से-नीचे पर कॉल करने देता है। इसके लिए केस और तर्क @ shiplu.mokadd.im here द्वारा प्रदान किया जाता है।
अपने खुद के मामले का मूल्यांकन करें और उनमें से एक का चयन करें। सौभाग्य!

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