स्पष्ट भाषेत मॉडेल व्ह्यू कंट्रोलर. नियंत्रक. मग MVC तरी कुठे आहे?

इतर मॉडेल 14.03.2019
इतर मॉडेल
अनेक लोक एकाच कार्यासह काम करण्यासाठी एक प्रकल्प लिहू लागतात, याचा अर्थ असा नाही की तो बहु-वापरकर्ता व्यवस्थापन प्रणालीमध्ये वाढू शकतो, उदाहरणार्थ, सामग्री किंवा, देव मना करू शकतो, उत्पादन. आणि सर्व काही छान आणि छान दिसते, सर्वकाही कार्य करते, जोपर्यंत आपण हे समजू लागत नाही की लिहिलेल्या कोडमध्ये पूर्णपणे क्रॅच आणि हार्ड कोड असतात. कोड लेआउट, क्वेरी आणि क्रॅचसह मिश्रित आहे, कधीकधी वाचताही येत नाही. उठतो तातडीची समस्या: नवीन वैशिष्ट्ये जोडताना, "तिथे काय लिहिले होते?" हे लक्षात ठेवून तुम्हाला बराच काळ हा कोड टिंकर करावा लागेल. आणि भूतकाळात स्वतःला शाप द्या.

तुम्ही डिझाईन नमुन्यांबद्दल ऐकले असेल आणि या अद्भुत पुस्तकांमधून पानही घेतले असेल:

  • E. Gamma, R. Helm, R. Johnson, J. Vlissides “वस्तुनिष्ठ तंत्रे ओरिएंटेड डिझाइन. डिझाइन नमुने";
  • एम. फॉलर "एंटरप्राइझ सॉफ्टवेअर ऍप्लिकेशन्सचे आर्किटेक्चर."
आणि पुष्कळांनी, अवाढव्य हस्तपुस्तिका आणि दस्तऐवजीकरणाने निःसंकोच, कोणत्याही आधुनिक फ्रेमवर्कचा अभ्यास करण्याचा प्रयत्न केला आणि, समजून घेण्याच्या जटिलतेचा सामना केला (अनेक स्थापत्य संकल्पनांच्या उपस्थितीमुळे चतुराईने एकमेकांशी जोडलेले आहेत), अभ्यास आणि वापर थांबविला. आधुनिक साधने "मागील बर्नरवर."

हा लेख प्रामुख्याने नवशिक्यांसाठी उपयुक्त ठरेल. असो, मला आशा आहे की काही तासांत तुम्हाला कल्पना येईल MVC अंमलबजावणीपॅटर्न जो सर्व आधुनिक वेब फ्रेमवर्कला अधोरेखित करतो आणि "ते कसे करावे" यावर पुढील प्रतिबिंबासाठी "अन्न" देखील मिळवतो. लेखाच्या शेवटी एक निवड आहे उपयुक्त दुवे, जे तुम्हाला वेब फ्रेमवर्कमध्ये (MVC व्यतिरिक्त) काय असतात आणि ते कसे कार्य करतात हे समजून घेण्यास देखील मदत करेल.

अनुभवी PHP प्रोग्रामरना या लेखात स्वतःसाठी काही नवीन सापडण्याची शक्यता नाही, परंतु त्यांच्या टिप्पण्या आणि मुख्य मजकूरावरील टिप्पण्या खूप उपयुक्त ठरतील! कारण सिद्धांताशिवाय, सराव अशक्य आहे, आणि सरावशिवाय, सिद्धांत निरुपयोगी आहे, नंतर प्रथम थोडा सिद्धांत असेल, आणि नंतर आपण सरावाकडे जाऊ. जर तुम्ही MVC संकल्पनेशी आधीच परिचित असाल, तर तुम्ही सिद्धांत विभाग वगळू शकता आणि थेट सरावावर जाऊ शकता.

1. सिद्धांत MVC पॅटर्न अनुप्रयोगाची रचना करण्याचा एक सोपा मार्ग वर्णन करतो, ज्याचा उद्देश वापरकर्ता इंटरफेसपासून व्यवसाय तर्कशास्त्र वेगळे करणे आहे. परिणामी, अनुप्रयोग स्केल करणे, चाचणी करणे, देखरेख करणे आणि अर्थातच अंमलबजावणी करणे सोपे आहे.

संकल्पनात्मक आकृतीचा विचार करा MVC टेम्पलेट(माझ्या मते, मी पाहिलेली ही सर्वात यशस्वी योजना आहे):

आर्किटेक्चर मध्ये MVC मॉडेलडेटा आणि व्यवसाय तर्कशास्त्र नियम प्रदान करते, दृश्य वापरकर्ता इंटरफेससाठी जबाबदार आहे आणि नियंत्रक मॉडेल आणि दृश्य यांच्यातील परस्परसंवाद प्रदान करतो.

MVC अनुप्रयोगाचा ठराविक प्रवाह खालीलप्रमाणे वर्णन केला जाऊ शकतो:

  • जेव्हा वापरकर्ता वेब संसाधनाला भेट देतो, तेव्हा इनिशिएलायझेशन स्क्रिप्ट ऍप्लिकेशनचे एक उदाहरण तयार करते आणि अंमलबजावणीसाठी लॉन्च करते.
    हे दृश्य दाखवते, म्हणा मुख्यपृष्ठजागा.
  • अनुप्रयोगास वापरकर्त्याकडून विनंती प्राप्त होते आणि विनंती केलेले नियंत्रक आणि कृती निर्धारित करते. मुख्य पृष्ठाच्या बाबतीत, डीफॉल्ट क्रिया केली जाते ( निर्देशांक).
  • ऍप्लिकेशन कंट्रोलर इन्स्टंट करतो आणि कृती पद्धत चालवतो,
    ज्यामध्ये, उदाहरणार्थ, डेटाबेसमधील माहिती वाचणारे मॉडेल कॉल असतात.
  • यानंतर, कृती मॉडेलमधून मिळवलेल्या डेटासह एक दृश्य तयार करते आणि परिणाम वापरकर्त्यास प्रदर्शित करते.
  • मॉडेल - अनुप्रयोगाचे व्यावसायिक तर्क समाविष्ट करते आणि त्यात नमुना घेण्याच्या पद्धती (या ORM पद्धती असू शकतात), प्रक्रिया (उदाहरणार्थ, प्रमाणीकरण नियम) आणि विशिष्ट डेटा प्रदान करते, ज्यामुळे ते बरेचदा जाड होते, जे अगदी सामान्य आहे.
    मॉडेलने वापरकर्त्याशी थेट संवाद साधू नये. वापरकर्त्याच्या विनंतीशी संबंधित सर्व व्हेरिएबल्सवर कंट्रोलरमध्ये प्रक्रिया करणे आवश्यक आहे.
    मॉडेलने HTML किंवा इतर डिस्प्ले कोड व्युत्पन्न करू नये जो वापरकर्त्याच्या गरजेनुसार बदलू शकतो. अशा कोडवर दृश्यांमध्ये प्रक्रिया केली पाहिजे.
    समान मॉडेल, उदाहरणार्थ: वापरकर्ता प्रमाणीकरण मॉडेल अनुप्रयोगाच्या वापरकर्ता आणि प्रशासकीय भागांमध्ये वापरले जाऊ शकते. या प्रकरणात, आपण सामान्य कोड वेगळ्या वर्गात हलवू शकता आणि वंशजांमधील उप-अनुप्रयोगांसाठी विशिष्ट पद्धती परिभाषित करून त्यातून वारसा घेऊ शकता.

    व्ह्यू - कंट्रोलर आणि मॉडेलकडून प्राप्त झालेल्या डेटाचे बाह्य प्रदर्शन निर्दिष्ट करण्यासाठी वापरले जाते.
    व्ह्यूजमध्ये HTML मार्कअप आणि डेटा ट्रॅव्हर्स, फॉरमॅट आणि डिस्प्ले करण्यासाठी PHP कोडचे छोटे इन्सर्ट असतात.
    डेटाबेसमध्ये थेट प्रवेश करू नये. मॉडेल्सनी हेच करायला हवे.
    वापरकर्त्याच्या विनंतीवरून मिळवलेल्या डेटासह कार्य करू नये. हे कार्य नियंत्रकाने केले पाहिजे.
    आउटपुट-रेडी डेटा मिळविण्यासाठी कंट्रोलर किंवा मॉडेल्सच्या गुणधर्म आणि पद्धतींमध्ये थेट प्रवेश करू शकतो.
    दृश्ये सामान्यतः सर्व पृष्ठांसाठी समान मार्कअप असलेल्या सामान्य टेम्पलेटमध्ये विभागली जातात (उदाहरणार्थ, शीर्षलेख आणि तळटीप) आणि टेम्पलेटचे भाग जे मॉडेलमधून डेटा आउटपुट प्रदर्शित करण्यासाठी किंवा डेटा एंट्री फॉर्म प्रदर्शित करण्यासाठी वापरले जातात.

    कंट्रोलर हा एक गोंद आहे जो मॉडेल, दृश्ये आणि इतर घटकांना जोडतो कार्यरत अनुप्रयोग. वापरकर्त्याच्या विनंतीवर प्रक्रिया करण्यासाठी नियंत्रक जबाबदार आहे. कंट्रोलरमध्ये SQL क्वेरी असू नयेत. त्यांना मॉडेलमध्ये ठेवणे चांगले आहे. कंट्रोलरमध्ये HTML किंवा इतर मार्कअप नसावेत. ते दृश्यात आणण्यासारखे आहे.
    सु-डिझाइन केलेल्या MVC ऍप्लिकेशनमध्ये, कंट्रोलर सहसा खूप पातळ असतात आणि त्यात फक्त काही डझन ओळी कोड असतात. मध्ये स्टुपिड फॅट कंट्रोलर्स (एसएफसी) बद्दल काय सांगितले जाऊ शकत नाही सीएमएस जूमला. कंट्रोलर लॉजिक हे अगदी वैशिष्ट्यपूर्ण आहे आणि त्यातले बरेच काही चालते बेस वर्ग.
    मॉडेल, त्याउलट, खूप जाड आणि समाविष्ट आहेत सर्वाधिकडेटा प्रोसेसिंगशी संबंधित कोड, कारण त्यात समाविष्ट असलेली डेटा संरचना आणि व्यवसाय तर्क सामान्यतः विशिष्ट अनुप्रयोगासाठी अगदी विशिष्ट असतात.

    १.१. फ्रंट कंट्रोलर आणि पेज कंट्रोलर बहुतेक प्रकरणांमध्ये, वेब ऍप्लिकेशनसह वापरकर्ता परस्परसंवाद दुव्यांवर क्लिक करून होतो. आता तुमच्या ब्राउझरच्या ॲड्रेस बारकडे पहा - तुम्हाला मिळालेल्या या लिंकवरून हा मजकूर. इतर दुवे, जसे की या पृष्ठाच्या उजव्या बाजूला, तुम्हाला भिन्न सामग्री प्रदान करतील. अशा प्रकारे, लिंक वेब ऍप्लिकेशनला विशिष्ट कमांड दर्शवते.

    मला आशा आहे की तुम्ही आधीच लक्षात घेतले असेल की वेगवेगळ्या साइट्स परिपूर्ण असू शकतात भिन्न स्वरूपबांधकाम पत्ता लिहायची जागा. प्रत्येक फॉरमॅट वेब ऍप्लिकेशनचे आर्किटेक्चर प्रदर्शित करू शकते. हे नेहमीच होत नसले तरी, बहुतेक प्रकरणांमध्ये हे एक स्पष्ट तथ्य आहे.

    ॲड्रेस बारसाठी दोन पर्यायांचा विचार करू या, जे काही मजकूर आणि वापरकर्ता प्रोफाइल प्रदर्शित करतात.

    या प्रकरणात अंदाजे प्रक्रिया कोड:
    स्विच($_GET["कृती"]) ( केस "बद्दल" : need_once("about.php"); // "आमच्याबद्दल" पृष्ठ खंडित; केस "संपर्क" : need_once("contacts.php"); // "संपर्क" पृष्ठ खंड "feedback" : need_once("feedback.php"); // पृष्ठ "feedback" break; // पृष्ठ "404";
    मला वाटते की जवळजवळ प्रत्येकाने हे आधी केले आहे.

    URL राउटिंग इंजिन वापरून, समान माहिती प्रदर्शित करण्यासाठी तुम्ही तुमचा अर्ज यासारख्या विनंत्या स्वीकारण्यासाठी कॉन्फिगर करू शकता:
    http://www.example.com/contacts/feedback

    येथे संपर्क नियंत्रकाचे प्रतिनिधित्व करतात आणि अभिप्राय ही संपर्क नियंत्रक पद्धत आहे जी फॉर्म प्रदर्शित करते अभिप्रायइ. आम्ही व्यावहारिक भागात या समस्येकडे परत येऊ.

    हे जाणून घेणे देखील योग्य आहे की अनेक वेब फ्रेमवर्कचे राउटर तुम्हाला सानुकूल URL मार्ग (URL च्या प्रत्येक भागाचा अर्थ काय ते निर्दिष्ट करा) आणि त्यावर प्रक्रिया करण्याचे नियम तयार करण्याची परवानगी देतात.
    आता सरावासाठी पुढे जाण्यासाठी आपल्याकडे पुरेसे सैद्धांतिक ज्ञान आहे.

    2. प्रथम सराव करा, खालील फाइल आणि फोल्डर रचना तयार करूया:


    पुढे पाहताना, मी म्हणेन की कोर वर्ग मॉडेल, व्ह्यू आणि कंट्रोलर कोर फोल्डरमध्ये संग्रहित केले जातील.
    त्यांची मुले नियंत्रक, मॉडेल आणि दृश्य निर्देशिकेत संग्रहित केली जातील. index.php फाइल हा ऍप्लिकेशनमधील प्रवेश बिंदू आहे. bootstrap.php फाइल ऍप्लिकेशन लोड करणे, सर्व आवश्यक मॉड्यूल्स जोडणे इ.

    आम्ही क्रमाने जाऊ; चला index.php फाईल उघडू आणि त्यात खालील कोड भरा:
    ini_set("display_errors", 1); need_one "application/bootstrap.php";
    येथे कोणतेही प्रश्न नसावेत.

    पुढे, लगेच bootstrap.php फाइलवर जाऊया:
    need_one "core/model.php"; need_one "core/view.php"; need_one "core/controller.php"; need_one "core/route.php"; मार्ग::स्टार्ट(); // राउटर सुरू करा
    पहिल्या तीन ओळींमध्ये सध्या अस्तित्वात नसलेल्या कर्नल फाइल्सचा समावेश असेल. शेवटच्या ओळीफाईलला राउटर क्लासशी कनेक्ट करा आणि स्टॅटिक स्टार्ट मेथडवर कॉल करून अंमलबजावणीसाठी लॉन्च करा.

    २.१. URL राउटरची अंमलबजावणी करणे सध्यासाठी, चला MVC पॅटर्नच्या अंमलबजावणीपासून दूर जाऊ आणि राउटिंगवर लक्ष केंद्रित करू. आपल्याला लिहून ठेवण्याची पहिली पायरी आहे खालील कोड htaccess मध्ये:
    RewriteEngine On RewriteCond %(REQUEST_FILENAME) !-f RewriteCond %(REQUEST_FILENAME) !-d RewriteRule .* index.php [L]
    हा कोड सर्व पृष्ठ प्रक्रिया index.php वर पुनर्निर्देशित करेल, जे आम्हाला आवश्यक आहे. लक्षात ठेवा पहिल्या भागात आम्ही फ्रंट कंट्रोलरबद्दल बोललो होतो?!

    आम्ही रूटिंग मध्ये ठेवू स्वतंत्र फाइल route.php कोर डिरेक्ट्रीमध्ये. या फाईलमध्ये आम्ही रूट क्लासचे वर्णन करू, जे कंट्रोलर मेथड रन करेल, ज्यामुळे पेज व्ह्यू तयार होईल.

    route.php फाइलची सामग्री

    वर्ग मार्ग ( स्थिर कार्य प्रारंभ() ( // नियंत्रक आणि डीफॉल्ट क्रिया $controller_name = "मुख्य"; $action_name = "index"; $routes = explode("/", $_SERVER["REQUEST_URI"]); // मिळवा कंट्रोलरचे नाव जर (!empty($routes)) ( $controller_name = $routes; ) // क्रियेचे नाव मिळवा जर (!empty($routes)) ( $action_name = $routes; ) // उपसर्ग जोडा $model_name = "मॉडेल_".$controller_name; $controller_name; $action_name = "action_".$action_name; // मॉडेल क्लास (मॉडेल फाइल असू शकत नाही) $model_file = strtolower ($model_name) ".php"; $model_path = "application/models/".$model_file; if(file_exists/$model_file;) नियंत्रक वर्गासह $controller_file = strtolower ($controller_name.php"; $controller_path = "application/controllers/."$controller_file; if(file_exists($controller_path)) ( "application/controllers/."$controller_file समाविष्ट करा; ) अन्यथा ( /* येथे अपवाद टाकणे योग्य होईल, परंतु गोष्टी सुलभ करण्यासाठी, आम्ही त्वरित 404 पृष्ठावर पुनर्निर्देशित करू */ मार्ग::ErrorPage404(); ) // एक नियंत्रक $controller = नवीन $controller_name तयार करा ; $action = $action_name; if(method_exists($controller, $action)) ( // कंट्रोलर क्रियेला कॉल करा $controller->$action(); ) इतर (// येथे अपवाद मार्ग::ErrorPage404();) टाकणे अधिक शहाणपणाचे ठरेल. ) फंक्शन ErrorPage404( ) ( $host = "http://."$_SERVER["HTTP_HOST"]."/"; शीर्षलेख("HTTP/1.1 404 सापडले नाही"); शीर्षलेख ("स्थिती: 404 आढळले नाही"); शीर्षलेख ("स्थान:."$होस्ट."404"); ))


    मी लक्षात घेतो की वर्ग अतिशय सरलीकृत तर्कशास्त्र (विपुल कोड असूनही) लागू करतो आणि त्यात सुरक्षा समस्या देखील असू शकतात. हे जाणूनबुजून केले गेले, कारण... संपूर्ण राउटिंग क्लास लिहिणे किमान स्वतंत्र लेखास पात्र आहे. चला मुख्य मुद्दे पाहूया...

    जागतिक ॲरे घटक $_SERVER["REQUEST_URI"] मध्ये वापरकर्त्याने संपर्क साधलेला पूर्ण पत्ता असतो.
    उदाहरणार्थ: example.ru/contacts/feedback

    फंक्शन वापरणे एकदम बाहेर पडणेपत्ता घटकांमध्ये विभागलेला आहे. परिणामी, आम्हाला नियंत्रकाचे नाव मिळाले, उदाहरणासाठी, हे नियंत्रक आहे संपर्कआणि कारवाईचे नाव, आमच्या बाबतीत - अभिप्राय.

    पुढे, मॉडेल फाईल (मॉडेल गहाळ असू शकते) आणि कंट्रोलर फाइल, जर असेल तर, कनेक्ट केली जातात आणि शेवटी, कंट्रोलरचे उदाहरण तयार केले जाते आणि कंट्रोलर क्लासमध्ये वर्णन केले असल्यास, कृती पुन्हा कॉल केली जाते.

    अशा प्रकारे, उदाहरणार्थ, पत्त्यावर जाताना:
    example.com/portfolio
    किंवा
    example.com/portfolio/index
    राउटर खालील क्रिया करेल:

  • मॉडेल फोल्डरमधील model_portfolio.php फाइल समाविष्ट करेल, ज्यामध्ये Model_Portfolio वर्ग असेल;
  • कंट्रोलर्स फोल्डरमधील controller_portfolio.php फाइल समाविष्ट करेल, ज्यामध्ये Controller_Portfolio वर्ग असेल;
  • Controller_Portfolio वर्गाचे एक उदाहरण तयार करेल आणि त्यात वर्णन केलेल्या मुलभूत क्रिया - action_index ला कॉल करेल.
  • वापरकर्त्याने अस्तित्वात नसलेल्या नियंत्रकाच्या पत्त्यावर प्रवेश करण्याचा प्रयत्न केल्यास, उदाहरणार्थ:
    example.com/ufo
    नंतर त्याला "404" पृष्ठावर पुनर्निर्देशित केले जाईल:
    example.com/404
    जर वापरकर्त्याने कंट्रोलरमध्ये वर्णन न केलेल्या क्रियेत प्रवेश केला तर तेच होईल.2.2. चला MVC अंमलबजावणीकडे परत जाऊया मूळ फोल्डरवर जाऊ आणि route.php फाइलमध्ये आणखी तीन फाइल्स जोडू: model.php, view.php आणि controller.php


    मी तुम्हाला आठवण करून देतो की त्यामध्ये बेस क्लास असतील, जे आता आपण लिहायला सुरुवात करू.

    model.php फाइलची सामग्री
    वर्ग मॉडेल ( सार्वजनिक कार्य get_data() ( ) )
    मॉडेल वर्गामध्ये एकच रिक्त डेटा प्राप्त करण्याची पद्धत आहे, जी वंशज वर्गांमध्ये अधिलिखित केली जाईल. जेव्हा आपण वंशज वर्ग तयार करतो तेव्हा सर्व काही स्पष्ट होईल.

    view.php फाइलची सामग्री
    वर्ग दृश्य ( //public $template_view; // येथे तुम्ही डीफॉल्ट सामान्य दृश्य निर्दिष्ट करू शकता. फंक्शन जनरेट($content_view, $template_view, $data = null) ( /* if(is_array($data)) ( // कन्व्हर्ट ॲरे व्हेरिएबल्स एक्स्ट्रॅक्ट ($डेटा) मध्ये घटक;
    त्या पद्धतीचा अंदाज लावणे अवघड नाही उत्पन्न कराएक दृश्य तयार करण्याचा हेतू आहे. खालील पॅरामीटर्स त्यास पास केले जातात:

  • $content_file - पृष्ठ सामग्री प्रदर्शित करणारी दृश्ये;
  • $template_file - टेम्पलेट सर्व पृष्ठांसाठी सामान्य आहे;
  • $data हे पृष्ठ सामग्री घटक असलेली ॲरे आहे. सहसा मॉडेलमध्ये भरले जाते.
  • समाविष्ट फंक्शन डायनॅमिकपणे सामान्य टेम्पलेट (दृश्य) कनेक्ट करते ज्यामध्ये दृश्य एम्बेड केले जाईल
    विशिष्ट पृष्ठाची सामग्री प्रदर्शित करण्यासाठी.

    आमच्या बाबतीत, सामान्य टेम्पलेटमध्ये शीर्षलेख, मेनू, साइडबार आणि तळटीप समाविष्ट असेल आणि पृष्ठांची सामग्री यात समाविष्ट असेल स्वतंत्र फॉर्म. पुन्हा, हे साधेपणासाठी केले जाते.

    controller.php फाइलची सामग्री
    क्लास कंट्रोलर ( सार्वजनिक $मॉडेल; सार्वजनिक $view; फंक्शन __construct() ( $this->view = new View(); ) function action_index() ( )
    पद्धत क्रिया_निर्देशांक- ही क्रिया डीफॉल्टनुसार म्हणतात; वंशज वर्ग लागू करताना आम्ही ती ओव्हरराइड करू.

    २.३. वंशज वर्ग मॉडेल आणि कंट्रोलरची अंमलबजावणी, दृश्याची निर्मिती आता मजा सुरू होते! आमच्या व्यवसाय कार्ड वेबसाइटमध्ये खालील पृष्ठे असतील:
  • मुख्यपृष्ठ
  • सेवा
  • पोर्टफोलिओ
  • संपर्क
  • आणि देखील - "404" पृष्ठ
  • प्रत्येक पृष्ठास नियंत्रक फोल्डरमधील स्वतःचे नियंत्रक आणि दृश्य फोल्डरमधील दृश्य असते. काही पृष्ठे मॉडेल फोल्डरमधील मॉडेल किंवा मॉडेल वापरू शकतात.


    मागील आकृतीमध्ये, template_view.php फाइल स्वतंत्रपणे हायलाइट केली आहे - हे सर्व पृष्ठांसाठी समान मार्कअप असलेले टेम्पलेट आहे. सर्वात सोप्या प्रकरणात ते असे दिसू शकते:
    मुख्यपृष्ठ
    साइटला सादर करण्यायोग्य स्वरूप देण्यासाठी, आम्ही डिझाइन करतो CSS टेम्पलेटआणि HTML मार्कअपची रचना बदलून आमच्या वेबसाइटमध्ये समाकलित करा आणि CSS कनेक्शनआणि JavaScript फाइल्स:

    लेखाच्या शेवटी, "परिणाम" विभागात, एका प्रकल्पासह GitHub भांडाराचा दुवा आहे ज्यामध्ये एक साधे टेम्पलेट एकत्रित करण्यासाठी पावले उचलली गेली आहेत.

    २.३.१. मुख्य पृष्ठ तयार करत आहे चला controller_main.php सह प्रारंभ करूया, त्याचा कोड येथे आहे:
    क्लास Controller_Main कंट्रोलरचा विस्तार करतो ( फंक्शन action_index() ( $this->view->generate("main_view.php", "template_view.php"); ) )
    पद्धतीने उत्पन्न करादृश्य वर्गाचे उदाहरण, सामान्य टेम्पलेटच्या फाइल्सची नावे आणि पृष्ठ सामग्रीसह दृश्य पास केले जातात.
    इंडेक्स क्रियेव्यतिरिक्त, कंट्रोलरमध्ये अर्थातच इतर क्रिया असू शकतात.

    सह फाइल करा सामान्य दृश्यआम्ही आधी पाहिले. सामग्री फाइल main_view.php विचारात घ्या:
    स्वागत आहे!

    OLOLOSHA TEAM ही वेबसाइट डेव्हलपमेंट क्षेत्रातील प्रथम श्रेणीतील तज्ञांची एक टीम आहे ज्याला भारत आणि सिलोनमधील मेक्सिकन मुखवटे, कांस्य आणि दगडी पुतळे, पाच-सहा शतके इक्वेटोरियल आफ्रिकेच्या मास्टर्सनी तयार केलेल्या बेस-रिलीफ्स आणि शिल्पे गोळा करण्याचा अनेक वर्षांचा अनुभव आहे. पूर्वी...


    येथे समाविष्ट आहे साधे मार्कअपकोणत्याही PHP कॉलशिवाय.
    मुख्य पृष्ठ प्रदर्शित करण्यासाठी, आपण खालील पत्त्यांपैकी एक वापरू शकता:

    आम्ही खालील मॉडेलमधून प्राप्त केलेला डेटा प्रदर्शित करणारे दृश्य वापरून उदाहरणाचा विचार करू.

    २.३.२. एक "पोर्टफोलिओ" पृष्ठ तयार करा आमच्या बाबतीत, "पोर्टफोलिओ" पृष्ठ आहे एकच पानमॉडेल वापरून.
    मॉडेलमध्ये सामान्यतः डेटा सॅम्पलिंग पद्धती समाविष्ट असतात, उदाहरणार्थ:
  • मूळ pgsql किंवा mysql लायब्ररीच्या पद्धती;
  • लायब्ररीच्या पद्धती ज्या डेटा ॲब्स्ट्रॅक्शन लागू करतात. उदाहरणार्थ, PEAR MDB2 लायब्ररीच्या पद्धती;
  • ORM पद्धती;
  • NoSQL सह काम करण्याच्या पद्धती;
  • आणि इ.
  • साधेपणासाठी, आम्ही येथे SQL क्वेरी किंवा ORM विधाने वापरणार नाही. त्याऐवजी, आम्ही वास्तविक डेटाचे अनुकरण करू आणि लगेचच परिणामांची श्रेणी परत करू.
    मॉडेल फाइल model_portfolio.php मॉडेल फोल्डरमध्ये ठेवा. त्याची सामग्री येथे आहेतः
    वर्ग मॉडेल_पोर्टफोलिओ मॉडेल ( सार्वजनिक कार्य get_data() ( रिटर्न ॲरे("वर्ष" => "२०१२", "साइट" => "http://DunkelBeer.ru", "वर्णन" => "प्रमोशनल साइट पासून गडद Dunkel बिअर जर्मन निर्माता Löwenbraü ची निर्मिती रशियामध्ये मद्यनिर्मिती कंपनी "SUN InBev." द्वारे केली जाते, array("Year" => "2012", "Site" => "http://ZopoMobile.ru", "वर्णन" => "रशियन-भाषा कॅटलॉग चिनी फोन Zopo कंपनी चालू आहे Android आधारितत्यांच्यासाठी OS आणि ॲक्सेसरीज."), // todo); )

    मॉडेल कंट्रोलर क्लास controller_portfolio.php फाइलमध्ये समाविष्ट आहे, त्याचा कोड येथे आहे:
    क्लास कंट्रोलर_पोर्टफोलिओ कंट्रोलर ( फंक्शन __कन्स्ट्रक्ट () ( $this->मॉडेल = नवीन मॉडेल_पोर्टफोलिओ(); $this->view = new View(); ) function action_index() ( $data = $this->model->get_data( $this->view->generate("portfolio_view.php", "template_view.php", $data) )
    व्हेरिएबलला डेटापद्धतीद्वारे परत केलेला ॲरे लिहिला आहे डेटा मिळवाजे आम्ही आधी पाहिले.
    हे व्हेरिएबल नंतर पद्धत पॅरामीटर म्हणून पास केले जाते उत्पन्न करा, ज्यामध्ये हे देखील समाविष्ट आहे: सह फाइल नाव सामान्य टेम्पलेटआणि पृष्ठ सामग्रीसह दृश्य असलेल्या फाइलचे नाव.

    पृष्ठ सामग्री असलेले दृश्य portfolio_view.php फाइलमध्ये आहे.
    पोर्टफोलिओ

    खालील सारणीतील सर्व प्रकल्प काल्पनिक आहेत, म्हणून दिलेल्या लिंक्सचे अनुसरण करण्याचा प्रयत्न देखील करू नका.
    वर्षप्रकल्पवर्णन


    येथे सर्व काही सोपे आहे, दृश्य मॉडेलमधून प्राप्त केलेला डेटा प्रदर्शित करते.

    २.३.३. उर्वरित पृष्ठे तयार करणे उर्वरित पृष्ठे त्याच प्रकारे तयार केली जातात. त्यांचा कोड GitHub रेपॉजिटरीमध्ये उपलब्ध आहे, ज्याची लिंक लेखाच्या शेवटी, “परिणाम” विभागात प्रदान केली आहे.3. निकाल शेवटी काय झाले ते येथे आहे:

    परिणामी व्यवसाय कार्ड वेबसाइटचा स्क्रीनशॉट



    GitHub लिंक: https://github.com/vitalyswipe/tinymvc/zipball/v0.1

    परंतु या आवृत्तीमध्ये मी खालील वर्ग (आणि त्यांचे संबंधित प्रकार) रेखाटले आहेत:

    • Controller_Login ज्यामध्ये लॉगिन आणि पासवर्ड एंटर करण्यासाठी फॉर्मसह एक दृश्य तयार केले जाते, ते भरल्यानंतर प्रमाणीकरण प्रक्रिया केली जाते आणि यशस्वी झाल्यास, वापरकर्त्यास प्रशासक पॅनेलकडे पुनर्निर्देशित केले जाते.
    • Contorller_Admin अनुक्रमणिका क्रियेसह जे वापरकर्त्यास साइटवर पूर्वी प्रशासक म्हणून अधिकृत केले होते की नाही हे तपासते (तसे असल्यास, प्रशासक पॅनेल दृश्य प्रदर्शित केले जाते) आणि लॉग आउट करण्यासाठी लॉगआउट क्रिया.
    प्रमाणीकरण आणि अधिकृतता हा एक वेगळा विषय आहे, त्यामुळे त्याची इथे चर्चा नाही, तर फक्त वर दिलेली लिंक दिली आहे जेणेकरुन तुम्हाला काहीतरी सुरू करावे लागेल.4 पासून. निष्कर्ष एमव्हीसी पॅटर्नचा वापर अनेक फ्रेमवर्क आणि सीएमएसमध्ये आर्किटेक्चरल आधार म्हणून केला जातो जो उच्च दर्जाचा विकास करण्यास सक्षम होण्यासाठी तयार केला गेला होता. जटिल उपायअधिक साठी अल्पकालीन. अमूर्ततेची पातळी वाढवून हे शक्य झाले आहे, कारण मानवी मेंदू कार्य करू शकणाऱ्या संरचनांच्या जटिलतेला मर्यादा आहे.

    परंतु, साधे वेब ॲप्लिकेशन्स (उदाहरणार्थ, बिझनेस कार्ड साइट्स) विकसित करताना, अनेक शेकडो फाइल्स असलेल्या Yii किंवा Kohana सारख्या वेब फ्रेमवर्कचा वापर करणे नेहमीच योग्य नसते. आता आम्ही एक सुंदर MVC मॉडेल तयार करू शकतो जेणेकरून Php, Html, CSS आणि मिसळू नये JavaScript कोडएका फाईलमध्ये.

    हा लेख CMF शिकण्यासाठी एक प्रारंभिक बिंदू आहे जे तुम्ही तुमच्या वेब ऍप्लिकेशनसाठी आधार म्हणून वापरू शकता असे खरोखरच योग्य आहे. कदाचित यामुळे तुम्हाला प्रेरणा मिळाली असेल आणि तुम्ही आधीच MVC वर आधारित तुमचे स्वतःचे मायक्रोफ्रेमवर्क किंवा CMS लिहिण्याचा विचार करत आहात. परंतु, "ब्लॅकजॅक आणि वेश्या" सह पुढील चाक पुन्हा शोधण्यापूर्वी पुन्हा विचार करा: कदाचित तुमच्या प्रयत्नांना विकासाकडे निर्देशित करणे आणि आधीच अस्तित्वात असलेल्या प्रकल्पाच्या समुदायाला मदत करणे अधिक वाजवी असेल?!

    P.S.: टिप्पण्यांमध्ये राहिलेल्या काही टिप्पण्या लक्षात घेऊन लेख पुन्हा लिहिला गेला. टीका खूप उपयुक्त ठरली. प्रतिसादानुसार: टिप्पण्या, पीएम आणि पोस्ट आवडींमध्ये जोडलेल्या वापरकर्त्यांची संख्या, ही पोस्ट लिहिण्याची कल्पना इतकी वाईट नाही. दुर्दैवाने, वेळेअभावी सर्व इच्छा विचारात घेणे आणि अधिक तपशीलवार लिहिणे शक्य नाही... परंतु कदाचित ज्या रहस्यमय व्यक्तींनी मूळ आवृत्ती नाकारली आहे ते हे करतील. तुमच्या प्रकल्पांसाठी शुभेच्छा!

    5. विषयावरील उपयुक्त लिंक्सची निवड लेख बऱ्याचदा वेब फ्रेमवर्कच्या विषयाला स्पर्श करतो - हा एक अतिशय विस्तृत विषय आहे, कारण मायक्रोफ्रेमवर्कमध्ये देखील अनेक घटक चतुराईने एकमेकांशी जोडलेले असतात आणि त्याबद्दल बोलण्यासाठी एकापेक्षा जास्त लेख लागतील. घटक तथापि, फ्रेमवर्कच्या विषयाशी एक प्रकारे किंवा दुसऱ्या प्रकारे संबंधित लिंक्सची एक छोटी निवड (ज्याचा मी हा लेख लिहिताना अनुसरण केला) येथे सादर करण्याचे मी ठरवले आहे.

    टॅग: टॅग जोडा

    शुभ दुपार, प्रिय सहकारी. या लेखात मी MVC, MVP आणि MVVM पॅटर्नमधील फरकांच्या माझ्या विश्लेषणात्मक समजाबद्दल बोलू इच्छितो. समजून घेण्याच्या इच्छेने हा लेख लिहिण्यास प्रवृत्त केले आधुनिक दृष्टिकोनमोठा विकास करताना सॉफ्टवेअरआणि संबंधित आर्किटेक्चरल वैशिष्ट्ये. माझ्या करिअरच्या शिडीच्या सध्याच्या टप्प्यावर, मी थेट विकासक नाही, त्यामुळे लेखात त्रुटी, अयोग्यता आणि गैरसमज असू शकतात. प्रोग्रामर आणि वास्तुविशारद काय करत आहेत हे विश्लेषक कसे पाहतात याची उत्सुकता आहे? मग मांजरीचे स्वागत आहे.

    लिंक्स मी सर्वप्रथम ज्याच्याशी सुरुवात करू इच्छितो ती म्हणजे लिंक्स बाह्य साहित्य, ज्याने मला हा लेख लिहिण्याच्या प्रक्रियेत मार्गदर्शन केले:
    परिचय ज्या काळात सूर्य प्रकाशमान होत होता आणि गवत अधिक हिरवे होते, या लेखाच्या लेखकासारख्या विद्यार्थ्यांच्या टीमने थेट उत्पादन इंटरफेसमध्ये कोडच्या शेकडो ओळी लिहून सॉफ्टवेअर विकसित केले. काहीवेळा डेटासह कार्य करण्यासाठी सेवा आणि व्यवस्थापकांचा वापर केला गेला आणि नंतर दस्तऐवज-दृश्य नमुना वापरून समाधान प्राप्त केले गेले. अशा कोडला सपोर्ट करण्यासाठी प्रचंड खर्च करावा लागतो, कारण नवीन विकसकाला प्रशिक्षित (सांगितले गेले होते) की उत्पादनामध्ये कोणता कोड जबाबदार आहे आणि कोणत्याही युनिट चाचणीबद्दल कोणतीही चर्चा नाही. विकास संघ 4 लोक आहे जे एका खोलीत बसतात.
    काळ गेला, काम बदलले. विकसित केले जाणारे ऍप्लिकेशन्स मोठे आणि अधिक जटिल बनले आणि विकासकांच्या एका एकत्रित संघातून विकासक, वास्तुविशारद, उपयोगिता विशेषज्ञ, डिझायनर आणि पीएम यांच्या विविध संघ बनले. आता प्रत्येकजण त्यांच्या स्वतःच्या क्षेत्रासाठी जबाबदार आहे: GUI, व्यवसाय तर्क, घटक. विश्लेषण, चाचणी आणि आर्किटेक्चर विभाग दिसू लागले. सॉफ्टवेअर डेव्हलपमेंटची किंमत शेकडो आणि हजारो पटीने वाढली आहे. विकासाच्या या दृष्टिकोनासाठी एक स्थिर आर्किटेक्चर आवश्यक आहे जे उत्पादनाच्या विविध कार्यात्मक क्षेत्रांना एकमेकांशी समक्रमित करेल जटिल सॉफ्टवेअर विकसित करण्यासाठी श्रम खर्च कमी करण्याचे उद्दिष्ट लक्षात घेऊन, आम्ही असे गृहीत धरतो की तयार युनिफाइड सोल्यूशन्स वापरणे आवश्यक आहे. शेवटी, टेम्प्लेट केलेल्या कृती विकसकांमधील संप्रेषण सुलभ करतात, आपल्याला ज्ञात डिझाइनचा संदर्भ घेण्याची परवानगी देतात आणि त्रुटींची संख्या कमी करतात.
    विकिपीडियाच्या मते, डिझाइन पॅटर्न ही पुनरावृत्ती करण्यायोग्य आर्किटेक्चरल डिझाइन आहे जी काही वारंवार घडणाऱ्या संदर्भांमध्ये डिझाइन समस्येचे निराकरण करते.

    चला प्रथम मुख्य गोष्टीसह प्रारंभ करूया - मॉडेल-व्ह्यू-कंट्रोलर. MVC हा एक मूलभूत पॅटर्न आहे ज्याने अनेक तंत्रज्ञानामध्ये प्रवेश केला आहे, नवीन तंत्रज्ञानाचा उदय झाला आहे आणि विकासकांसाठी दररोज जीवन सोपे बनवले आहे.

    MVC नमुना प्रथम SmallTalk भाषेत दिसला. विकासकांना एक आर्किटेक्चरल सोल्यूशन आणावे लागले जे त्यांना वेगळे करण्यास अनुमती देईल GUIव्यवसाय तर्कशास्त्र पासून, आणि डेटा पासून व्यवसाय तर्क. अशा प्रकारे, त्याच्या क्लासिक आवृत्तीमध्ये, MVC मध्ये तीन भाग असतात, जे त्यास त्याचे नाव देतात. चला त्यांना पाहूया:

    मॉडेल मॉडेल हा सहसा अनुप्रयोगाचा कार्यात्मक व्यवसाय तर्क असलेला भाग म्हणून समजला जातो. मॉडेल उर्वरित उत्पादनापासून पूर्णपणे स्वतंत्र असणे आवश्यक आहे. मॉडेल लेयरला डिझाइन घटकांबद्दल किंवा ते कसे प्रस्तुत केले जाईल याबद्दल काहीही माहित असणे आवश्यक नाही. एक परिणाम प्राप्त झाला आहे जो आपल्याला मॉडेलला स्पर्श न करता डेटाचे सादरीकरण, ते कसे प्रदर्शित केले जातात ते बदलण्याची परवानगी देतो.

    मॉडेलमध्ये खालील वैशिष्ट्ये आहेत:

    • मॉडेल हे अनुप्रयोगाचे व्यावसायिक तर्क आहे;
    • मॉडेलला स्वतःबद्दल ज्ञान आहे आणि नियंत्रक आणि दृश्यांबद्दल माहिती नाही;
    • काही प्रकल्पांसाठी, मॉडेल फक्त डेटा स्तर आहे (DAO, डेटाबेस, XML फाइल);
    • इतर प्रकल्पांसाठी, मॉडेल डेटाबेस व्यवस्थापक, ऑब्जेक्ट्सचा संच किंवा फक्त ऍप्लिकेशन लॉजिक आहे;
    पहा व्यूच्या जबाबदाऱ्यांमध्ये मॉडेलमधून मिळालेला डेटा प्रदर्शित करणे समाविष्ट आहे. तथापि, दृश्य मॉडेलवर थेट प्रभाव टाकू शकत नाही. आम्ही असे म्हणू शकतो की दृश्याला डेटावर केवळ-वाचनीय प्रवेश आहे.

    प्रस्तुतीकरणात खालील वैशिष्ट्ये आहेत:

    • दृश्य कोणत्याही प्रकारे मॉडेलमधून प्राप्त झालेल्या डेटाचे प्रदर्शन लागू करते;
    • काही प्रकरणांमध्ये, दृश्यामध्ये काही व्यावसायिक तर्क लागू करणारा कोड असू शकतो.
    सादरीकरणाची उदाहरणे: HTML पृष्ठ, WPF फॉर्म, MVP आणि MVVM आणि MVP मधील फरक MVC पॅटर्नचे सर्वात सामान्य प्रकार आहेत:
    • मॉडेल-दृश्य-नियंत्रक
    • मॉडेल-दृश्य-प्रस्तुतकर्ता
    • मॉडेल-दृश्य-दृश्य मॉडेल

    चला त्या प्रत्येकाचा विचार करूया आणि त्यांची तुलना करूया.

    मॉडेल-दृश्य-प्रस्तुतकर्ता

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

    सादरकर्त्याची चिन्हे:

    • प्रेझेंटरच्या उदाहरणावर योग्य फंक्शन्स किंवा इव्हेंट्स कॉल करून दृश्य थेट प्रस्तुतकर्त्याशी संवाद साधते;
    • प्रस्तुतकर्ता दृश्याद्वारे कार्यान्वित केलेला विशेष इंटरफेस वापरून दृश्याशी संवाद साधतो;
    • एक सादरकर्ता उदाहरण एका प्रदर्शनाशी संबंधित आहे.

    अंमलबजावणी:
    प्रत्येक दृश्याने संबंधित इंटरफेस लागू करणे आवश्यक आहे. व्ह्यू इंटरफेस वापरकर्त्याशी संवाद साधण्यासाठी आवश्यक असलेल्या फंक्शन्स आणि इव्हेंट्सचा सेट परिभाषित करतो (उदाहरणार्थ, IView .ShowErrorMessage(string msg)). प्रस्तुतकर्त्याकडे संबंधित इंटरफेसच्या अंमलबजावणीसाठी संदर्भ असणे आवश्यक आहे, जे सहसा कन्स्ट्रक्टरमध्ये पास केले जाते.
    प्रेझेंटेशन लॉजिकमध्ये प्रस्तुतकर्त्याच्या उदाहरणाचा संदर्भ असणे आवश्यक आहे. सर्व दृश्य इव्हेंट्स प्रक्रियेसाठी सादरकर्त्याकडे पाठवले जातात आणि सादरीकरण तर्काद्वारे (इतर दृश्यांच्या निर्मितीसह) जवळजवळ कधीही प्रक्रिया केली जात नाही.

    वापर उदाहरण: विंडोज फॉर्म.

    मॉडेल-दृश्य-दृश्य मॉडेल

    हा दृष्टिकोन तुम्हाला व्ह्यू मॉडेलच्या गुणधर्म आणि इव्हेंटसह दृश्य घटक संबद्ध करण्यास अनुमती देतो. असा युक्तिवाद केला जाऊ शकतो की या पॅटर्नच्या प्रत्येक लेयरला दुसर्या लेयरच्या अस्तित्वाबद्दल माहिती नसते.

    व्ह्यू मॉडेलची वैशिष्ट्ये:

    • सादरीकरणासह द्वि-मार्ग संप्रेषण;
    • दृश्य मॉडेल हे दृश्याचे अमूर्तीकरण आहे. सामान्यतः याचा अर्थ असा होतो की दृश्याचे गुणधर्म दृश्य/मॉडेलच्या गुणधर्मांसारखेच असतात
    • व्ह्यू मॉडेलमध्ये व्ह्यू इंटरफेस (IView) चा संदर्भ नाही. दृश्य मॉडेलची स्थिती बदलल्याने दृश्य आपोआप बदलते आणि त्याउलट, कारण डेटा बंधनकारक यंत्रणा वापरली जाते (बाइंडिंग)
    • व्ह्यू मॉडेलचे एक उदाहरण एका दृश्याशी संबंधित आहे.

    अंमलबजावणी:
    हा नमुना वापरताना, दृश्य संबंधित इंटरफेस (IView) लागू करत नाही.
    दृश्यामध्ये डेटा स्रोत (DataContex) चा दुवा असणे आवश्यक आहे, जे या प्रकरणातदृश्य मॉडेल आहे. दृश्य घटक दृश्य मॉडेलच्या संबंधित गुणधर्म आणि घटनांशी बांधील आहेत.
    या बदल्यात, व्ह्यू मॉडेल एक विशेष इंटरफेस लागू करते ज्याचा वापर केला जातो स्वयंचलित अद्यतनसादरीकरण घटक. WPF मधील अशा इंटरफेसचे उदाहरण INotifyPropertyChanged असेल.

    उदाहरण वापर: WPF

    मॉडेल-दृश्य-नियंत्रक
    या पॅटर्नची मुख्य कल्पना अशी आहे की नियंत्रक आणि दृश्य दोन्ही मॉडेलवर अवलंबून असतात, परंतु मॉडेल या दोन घटकांवर अवलंबून नाही.

    नियंत्रक वैशिष्ट्ये

    • या क्षणी कोणते दृश्य प्रदर्शित केले जावे हे नियंत्रक ठरवतो;
    • इव्हेंट पाहणे केवळ कंट्रोलरवर परिणाम करू शकते आणि कंट्रोलर मॉडेलला प्रभावित करू शकतो आणि दुसरे दृश्य परिभाषित करू शकतो.
    • फक्त एका नियंत्रकासाठी एकाधिक दृश्ये शक्य आहेत;

    अंमलबजावणी:
    कंट्रोलर घटना बाहेरून रोखतो आणि त्यात अंतर्भूत केलेल्या तर्कानुसार, योग्य पद्धत कॉल करून मॉडेल बदलून या इव्हेंटवर प्रतिक्रिया देतो. बदलानंतर, मॉडेल तो बदललेला इव्हेंट वापरतो आणि याला सबस्क्राइब केलेले सर्व दृश्य इव्हेंट, ते प्राप्त झाल्यानंतर, अद्ययावत डेटासाठी मॉडेलकडे वळते, त्यानंतर ते प्रदर्शित केले जातात.

    वापर उदाहरण: MVC ASP.NET

    सारांश MVVM आणि MVP पॅटर्नची अंमलबजावणी, पहिल्या दृष्टीक्षेपात, अगदी सोपी आणि समान दिसते. तथापि, MVVM साठी दृश्याचे व्यू-मॉडेलवर बंधन आपोआप होते, परंतु MVP साठी प्रोग्राम करणे आवश्यक आहे.
    MVC वरवर पाहता आहे अधिक शक्यता MVVM पॅटर्न निवडण्याचे सामान्य नियम
    • अशा परिस्थितीत वापरले जाते जेथे इनपुटची आवश्यकता नसताना डेटा लिंक करणे शक्य आहे विशेष इंटरफेसदृश्ये (म्हणजे IView लागू करण्याची आवश्यकता नाही);
    • एक सामान्य उदाहरण म्हणजे WPF तंत्रज्ञान.
    MVP
    • डेटा बाइंडिंग शक्य नसलेल्या परिस्थितीत वापरले जाते (बाइंडिंग वापरले जाऊ शकत नाही);
    • विंडोज फॉर्म्स वापरणे हे एक सामान्य उदाहरण असेल.
    MVC
    • अशा परिस्थितीत वापरले जाते जेथे दृश्य आणि अनुप्रयोगाच्या इतर भागांमधील संवाद शक्य नाही (आणि आपण MVVM किंवा MVP वापरू शकत नाही);
    • ASP.NET MVC हे सामान्य वापराचे प्रकरण आहे.
    निष्कर्ष शेवटी, या लेखाचा लेखक हे लक्षात ठेवू इच्छितो की केवळ एका पॅटर्नचे काटेकोरपणे पालन करणे नेहमीच नसते. सर्वोत्तम निवड. उदाहरणार्थ, कल्पना करा की आपण MVVM वापरून अनुप्रयोग विकसित करण्यासाठी वापरू इच्छिता विंडोज वापरूनबाइंडिंग्स कंट्रोल प्रॉपर्टीद्वारे फॉर्म. तुमचे ध्येय व्यवसाय तर्क आणि त्यांना जोडणारे तर्क यापासून सादरीकरण वेगळे करणे आहे. अनुप्रयोग चाचणी आणि समर्थन करणे सोपे आणि विश्लेषकांसाठी समजण्यासारखे असावे (अखेर, प्रश्न "काय मोजले जाते कठोर परिश्रम कराडिस्क" फक्त एकच बरोबर उत्तर आहे - ज्युल्समध्ये (अमूर्त उदाहरण मॉडेल -> दृश्ये)).

    तुमच्या वेळेबद्दल खूप खूप धन्यवाद, वाचनाचा आनंद घ्या!

    मॉडेल-व्ह्यू-कंट्रोलर (MVC) पॅटर्न, 1970 च्या दशकाच्या उत्तरार्धात सापडला, हा एक सॉफ्टवेअर आर्किटेक्चर डिझाइन पॅटर्न आहे ज्याचे मुख्य लक्ष्य डेटा फंक्शन्स त्यांच्या सादरीकरणापासून वेगळे करणे आहे. सैद्धांतिकदृष्ट्या, उत्तम प्रकारे डिझाइन केलेले MVC ऍप्लिकेशन फ्रंट-एंड आणि बॅक-एंड डेव्हलपरना त्यांच्या कामाच्या दरम्यान एकमेकांच्या जबाबदारीच्या क्षेत्रात हस्तक्षेप करू शकत नाही, म्हणजेच, फ्रंट-एंड डेव्हलपरला "स्वयंपाकघर" बद्दल काहीही माहित असणे आवश्यक नाही. त्याच्या बॅक-एंड सहकाऱ्याचा आणि त्याउलट.

    जरी MVC हे मूळतः डेस्कटॉप ऍप्लिकेशन्सच्या विकासासाठी डिझाइन केले गेले असले तरी, ते आधुनिक कार्यांसाठी अनुकूल केले गेले आहे आणि वेब डेव्हलपर्समध्ये अत्यंत लोकप्रिय आहे कारण, जबाबदाऱ्यांच्या पृथक्करणामुळे, एक स्पष्ट, अधिक सज्ज तयार करणे शक्य आहे. पुन्हा वापरकोड MVC पॅटर्नचा परिणाम स्वच्छ, मॉड्युलर सिस्टममध्ये होतो ज्यामुळे विकासकांना विद्यमान कोडमध्ये खूप लवकर बदल करता येतात.

    या लेखात आपण मूलभूत गोष्टी पाहू MVC तत्त्वे, पॅटर्नच्या व्याख्येपासून सुरुवात करून आणि एका छोट्या उदाहरणात त्याचा वापर सुरू ठेवा. हा लेख प्रामुख्याने त्यांच्यासाठी उपयुक्त ठरेल ज्यांना आयुष्यात कधीही या पॅटर्नचा सामना करावा लागला नाही आणि कदाचित, ज्यांना MVC चे ज्ञान वाढवायचे आहे त्यांच्यासाठी.

    MVC समजून घेणे

    आधीच नमूद केल्याप्रमाणे, पॅटर्नचे नाव तीन शब्दांच्या संक्षेपातून आले आहे: मॉडेल (मॉडेल), दृश्य (दृश्य) आणि नियंत्रक (नियंत्रक). थोडक्यात, पॅटर्नच्या ऑपरेशनचे तत्त्व एका आकृतीसह स्पष्ट केले जाऊ शकते (विकिपीडियावर आढळू शकते):

    हे आकृती पॅटर्नमधील माहितीचा दिशाहीन प्रवाह स्पष्टपणे दर्शवते आणि प्रत्येक घटकाच्या भूमिकांचे वर्णन देखील करते.

    मॉडेल

    मॉडेलचा वापर डेटामध्ये प्रवेश करण्यासाठी आणि हाताळण्यासाठी केला जातो. बहुतेक प्रकरणांमध्ये, मॉडेल हे डेटा स्टोअरमध्ये प्रवेश करण्यासाठी वापरले जाते (जसे की डेटाबेस). मॉडेल डेटा शोधणे, तो तयार करणे, त्यात बदल करणे आणि स्टोरेजमधून हटवणे यासाठी इंटरफेस प्रदान करते. MVC पॅटर्नच्या संदर्भात, मॉडेल दृश्य आणि नियंत्रक यांच्यातील मध्यस्थ आहे.

    अत्यंत महत्वाचे वैशिष्ट्यमॉडेल असे आहे की तांत्रिकदृष्ट्या त्याला कंट्रोलर आणि व्ह्यूमधील डेटासह काय होत आहे याची माहिती नसते. मॉडेलने कधीही इतर पॅटर्न घटकांना/कडून कोणत्याही विनंत्या करू नये किंवा प्रतीक्षा करू नये.

    तथापि, नेहमी लक्षात ठेवा की मॉडेल हे केवळ डेटाबेस किंवा इतर प्रणालीचे प्रवेशद्वार नाही जे डेटा पुढे-मागे हस्तांतरित करण्याशिवाय काहीही करत नाही. मॉडेल हे डेटाच्या प्रवेशद्वारासारखे असते. मॉडेल बहुतेक प्रकरणांमध्ये सिस्टमचा सर्वात जटिल भाग आहे, अंशतः मॉडेल स्वतःच इतर सर्व भागांसाठी कनेक्टिंग लिंक आहे या वस्तुस्थितीमुळे.

    कामगिरी

    मॉडेलमधून प्राप्त केलेला डेटा कोठे आउटपुट केला जातो हे दृश्य आहे योग्य स्वरूपात. MVC पॅटर्न वापरून विकसित केलेल्या पारंपारिक वेब ॲप्लिकेशन्समध्ये, व्ह्यू हा सिस्टमचा एक भाग आहे जिथे HTML कोड व्युत्पन्न केला जातो. नियंत्रकाकडे पाठवण्यासाठी वापरकर्त्याकडून क्रिया प्राप्त करण्यासाठी दृश्य देखील जबाबदार आहे. उदाहरणार्थ, दृश्य मध्ये एक बटण प्रदर्शित करते वापरकर्ता इंटरफेस, आणि दाबल्यानंतर ते संबंधित नियंत्रक क्रिया करते.

    दृश्याच्या उद्देशाबद्दल काही गैरसमज आहेत, विशेषत: वेब डेव्हलपर्समध्ये जे नुकतेच MVC वापरून त्यांचे ॲप्लिकेशन तयार करू लागले आहेत. सर्वात सामान्यपणे मोडलेल्या नियमांपैकी एक असा आहे की दृश्याने मॉडेलशी कोणत्याही प्रकारे संवाद साधू नये आणि दृश्याद्वारे प्राप्त केलेला सर्व डेटा केवळ नियंत्रकाकडून आला पाहिजे. व्यवहारात, विकासक अनेकदा या संकल्पनेकडे दुर्लक्ष करतात, जी MVC पॅटर्नचा केंद्रबिंदू आहे. Fabio Cevasco चा लेख अनेक गैर-मानक MVC फ्रेमवर्कपैकी एक, CakePHP वापरून MVC साठी हा गोंधळात टाकणारा दृष्टिकोन स्पष्ट करतो:

    हे समजून घेणे अत्यंत महत्त्वाचे आहे की योग्य MVC आर्किटेक्चर मिळविण्यासाठी, दृश्ये आणि मॉडेल्समध्ये कोणताही थेट संवाद असू नये. त्यांच्या दरम्यान डेटाची देवाणघेवाण करण्यासाठी सर्व तर्कशास्त्र नियंत्रकांमध्ये लागू केले जाणे आवश्यक आहे.

    याव्यतिरिक्त, एक सामान्य गैरसमज आहे की दृश्य ही फक्त टेम्पलेट फाइल आहे. टॉम बटलरने नमूद केल्याप्रमाणे, हा गैरसमज खूप मोठा आहे कारण अनेक विकासक अगदी सुरुवातीपासूनच MVC संरचनेचा गैरसमज करतात, त्यानंतर ते नवशिक्या विकसकांच्या जनसामान्यांमध्ये हे "ज्ञान" ओतण्यास सुरवात करतात. प्रत्यक्षात, एक दृश्य हे केवळ टेम्पलेटपेक्षा बरेच काही आहे, परंतु MVC पॅटर्नच्या शीर्षस्थानी तयार केलेल्या अनेक फ्रेमवर्कने दृश्याची संकल्पना इतकी विकृत केली आहे की त्यांचे अनुप्रयोग MVC पॅटर्नच्या दृष्टीने योग्य आहेत की नाही याची कोणीही काळजी घेत नाही.

    तसेच महत्वाचा मुद्दाव्ह्यू कधीही कंट्रोलरच्या "शुद्ध" डेटासह कार्य करत नाही, म्हणजेच कंट्रोलर मॉडेलला बायपास न करता दृश्यासह कधीही कार्य करत नाही. नियंत्रक आणि दृश्य यांच्यातील संवादादरम्यान, मॉडेल नेहमी त्यांच्या दरम्यान असावे.

    नियंत्रक

    कंट्रोलर हा MVC बंडलचा शेवटचा भाग आहे. नियंत्रकाचे कार्य वापरकर्त्याकडून डेटा प्राप्त करणे आणि मॉडेल हाताळणे हे आहे. हा कंट्रोलर आहे आणि फक्त तोच प्रणालीचा भाग आहे जो वापरकर्त्याशी संवाद साधतो.

    थोडक्यात, कंट्रोलरचे वर्णन माहिती संग्राहक म्हणून केले जाऊ शकते जे ते प्रक्रिया आणि स्टोरेजसाठी मॉडेलकडे पाठवते. हे डेटासह काहीही करू नये, परंतु केवळ वापरकर्त्याकडून ते प्राप्त करण्यास सक्षम असेल. नियंत्रक एक दृश्य आणि एका मॉडेलशी संबंधित आहे, अशा प्रकारे डेटाचा एक दिशाहीन प्रवाह आयोजित करतो, प्रत्येक टप्प्यावर त्याचे नियंत्रण करतो.

    हे लक्षात ठेवणे फार महत्वाचे आहे की नियंत्रक केवळ दृश्यासह वापरकर्त्याच्या परस्परसंवादाच्या परिणामी त्याचे कार्य सुरू करतो, जे संबंधित नियंत्रक कार्याला कॉल करते. विकसकांमधील सर्वात सामान्य चूक म्हणजे कंट्रोलरला दृश्य आणि मॉडेलमधील प्रवेशद्वार म्हणून पाहणे. परिणामी, कंट्रोलरला त्या फंक्शन्ससह संपन्न केले जाते जे दृश्याद्वारे केले जावेत (तसे, दृश्य ही फक्त टेम्पलेट फाइल आहे ही कल्पना येथून येते). त्या वर, बरेच लोक डेटा प्रक्रियेचे सर्व तर्क पूर्णपणे काढून टाकतात, का ते विसरतात MVC नमुनामॉडेल हेतू आहे.

    PHP मध्ये MVC

    मी वरील अंमलबजावणी करण्याचा प्रयत्न करण्याचा सल्ला देतो लहान अनुप्रयोग. चला मॉडेल, व्ह्यू आणि कंट्रोलर वर्ग तयार करून सुरुवात करूया:



    आम्ही वाचण्याची शिफारस करतो

    वर