में देखने के लिए मैं कुछ परियोजनाओं है कि मैं पर काम कर रहा हूँ के लिए अपने ही हाथ से लुढ़का पीएचपी MVC रूपरेखा है। जब मैंने पहली बार ढांचा बनाया, तो यह एक व्यवस्थापक सीएमएस बनाने के संदर्भ में था। इसलिए, मॉडल, दृश्य और नियंत्रक के बीच एक बहुत अच्छा संबंध था। आपके पास डीबी में एक पंक्ति है, जो एक मॉडल के लिए मानचित्र बनाती है। नियंत्रक मॉडल को लोड करता है और इसे प्रस्तुत करने के लिए इसे पास करता है (जैसे एक संपादन फ़ॉर्म में)। अच्छा, साफ, और आसान।पासिंग डेटा पीएचपी
हालांकि, अब मैं साइट के सामने के अंत में काम कर रहा हूं, चीजें चिपचिपा हो रही हैं। एक पृष्ठ हमेशा एक मॉडल का दृश्य नहीं होता है। यह 20 उपयोगकर्ता (प्रत्येक उपयोगकर्ता मॉडल) के साथ एक उपयोगकर्ता निर्देशिका सूची हो सकता है। इसके अलावा, अनुरोध के बारे में मेटाडेटा हो सकता है, जैसे पृष्ठांकन (वर्तमान पृष्ठ, कुल पृष्ठ, परिणामों की संख्या) और/या एक खोज क्वेरी।
मेरा प्रश्न है, को देखने के लिए यह सब डेटा पास करने के स्पष्ट तरीका क्या है?
कुछ विकल्प मैं विचार कर रहा हूँ:
class UserController{
public function renderView(){
// assume there's some logic to create models, get pagination, etc.
$data = array()
$data['models'] = $models;
$data['currentPage'] = $current;
$data['totalPages'] = $total;
return $view->render($data);
}
}
class UserView{
public function render($data){
// render the data
}
}
में गुण बनाएँ:
नियंत्रक एक सरणी बना सकते हैं और एक भी पैरामीटर के रूप में देखने के लिए कि पारित किया है कक्षा देखें और नियंत्रक उन्हें पॉप्युलेट करें:
class UserView{ public $models; public $currentPage; public $totalPages; } class UserController{ public function renderView(){ // assume there's some logic to create models, get pagination, etc. $view = new UserView(); $view->models = $models; $view->currentPage = $current; $view->totalPages = $total; return $view->render(); } }
किसी प्रकार के जेनेरिक हैश मैप या संग्रह ऑब्जेक्ट को एक कंटेनर के रूप में देखें जो किसी भी मनमाना संख्या और डेटा का नाम रख सकता है।
class UserView{ public $collection = new Collection(); // works like a Java collection } class UserController{ public function renderView(){ // assume there's some logic to create models, get pagination, etc. $view = new UserView(); $view->collection->add($models,'models'); $view->collection->add($currentPage,'currentPage'); return $view->render(); } }
मुझे पता है कि तकनीकी रूप से किसी भी सकता है काम की है, लेकिन मैं सबसे अच्छा विकल्प की अनिश्चित हूँ, या अगर कोई एक बेहतर या अधिक परंपरागत विकल्प है कि मैं याद कर रहा हूँ है।
मजेदार, मैंने इस सवाल को पोस्ट करने से पहले मैंने फैट मॉडल के बारे में जामिस बक के लेख को पढ़ा है, लेकिन मुझे एहसास नहीं हुआ कि अवधारणा को गुमराह करना इस अवधारणा पर संसाधनों की इतनी संपत्ति वापस कर देगा। मैंने सोचा कि यह सिर्फ अपना छोटा दर्शन था। पारितोषिक के लिए धन्यवाद। –
अच्छा लेख :-) मुझे यकीन नहीं है कि मैं फैट मॉडल विचार से पूरी तरह से सहमत हूं। मुझे लगता है कि मॉडल सिर्फ एक मॉडल होना चाहिए, जिस तरह से कार्य करें (एकवचन में)। दूसरे शब्दों में, FindPeople() जैसी विधि फिट नहीं होगी। हालांकि मैं पूरी तरह से एक पतला नियंत्रक के लाभ से सहमत हूं। सेवा परत के लिए तर्क दर्ज करें। अब मैं इसके बारे में ज्यादा नहीं जानता और एक विशेषज्ञ होने का दावा नहीं करता, लेकिन मुझे लगता है कि इसके लायक होने का मूल्य है। हां यह एक नई परत की अतिरिक्त जटिलता को जोड़ देगा, लेकिन नियंत्रक उदास लोगों को कॉल कर सकता है :: FindPeople() –
मॉडल स्वयं बहु-स्तरित हो सकता है। कुछ आउट-ऑफ-द-बॉक्स फ्रेमवर्क पहले से ही एक बहु-परत मॉडल के साथ आते हैं। सिम्फनी, उदाहरण के लिए, एक डीबीएएल और एक ओआरएम दोनों के साथ आता है, जो इसे प्रोपेल कार्यों के साथ मचान करता है। जेडएफ हमें टेबल और पंक्ति गेटवे देता है, और एक डोमेन मॉडल लागू करने के लिए इसे छोड़ देता है। मैं यहां बिल करविन के लेख को पढ़ने की सिफारिश करता हूं http://karwin.blogspot.com/2008/05/activerecord-does-not-suck.html - आकस्मिक रूप से वह भी और उत्साही है। –