2009-06-04 21 views
15

में देखने के लिए मैं कुछ परियोजनाओं है कि मैं पर काम कर रहा हूँ के लिए अपने ही हाथ से लुढ़का पीएचपी 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(); 
          } 
      } 
      

    मुझे पता है कि तकनीकी रूप से किसी भी सकता है काम की है, लेकिन मैं सबसे अच्छा विकल्प की अनिश्चित हूँ, या अगर कोई एक बेहतर या अधिक परंपरागत विकल्प है कि मैं याद कर रहा हूँ है।

  • उत्तर

    3

    मैं Fat Models, Skinny Controllers की अवधारणा की सिफारिश करने के लिए जा रहा हूँ (या, Fat Models Thin Controllers अगर आप पसंद करते ...)

    Otherwords में, अपने मॉडल भी सख्त है - अपने मॉडल बांधने केवल चीज़ को दर्शाने के तरह एक RowDataGateway अत्यंत है सीमित।

    वास्तव में, मुझे लगता है कि अच्छे मॉडल इस तथ्य को छुपाते हैं कि आप डेटाबेस से डेटा पढ़ रहे हैं। क्योंकि, वास्तव में, आपका डेटा टेक्स्ट फ़ाइलों, या वेब सेवा से, या जो कुछ भी हो सकता है। यदि आप अपने मॉडल को एक गौरवशाली डीबीएएल से ज्यादा कुछ नहीं मानते हैं, तो आप अपने नियंत्रकों में कसकर-युग्मित कोड रखने के लिए खुद को बर्बाद कर देते हैं जो आपको सोचने के तरीके से "डाटाबेस से केवल डेटा" से दूर नहीं होने देगा।

    +1

    मजेदार, मैंने इस सवाल को पोस्ट करने से पहले मैंने फैट मॉडल के बारे में जामिस बक के लेख को पढ़ा है, लेकिन मुझे एहसास नहीं हुआ कि अवधारणा को गुमराह करना इस अवधारणा पर संसाधनों की इतनी संपत्ति वापस कर देगा। मैंने सोचा कि यह सिर्फ अपना छोटा दर्शन था। पारितोषिक के लिए धन्यवाद। –

    +0

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

    +0

    मॉडल स्वयं बहु-स्तरित हो सकता है। कुछ आउट-ऑफ-द-बॉक्स फ्रेमवर्क पहले से ही एक बहु-परत मॉडल के साथ आते हैं। सिम्फनी, उदाहरण के लिए, एक डीबीएएल और एक ओआरएम दोनों के साथ आता है, जो इसे प्रोपेल कार्यों के साथ मचान करता है। जेडएफ हमें टेबल और पंक्ति गेटवे देता है, और एक डोमेन मॉडल लागू करने के लिए इसे छोड़ देता है। मैं यहां बिल करविन के लेख को पढ़ने की सिफारिश करता हूं http://karwin.blogspot.com/2008/05/activerecord-does-not-suck.html - आकस्मिक रूप से वह भी और उत्साही है। –

    0

    मैं लोकप्रिय MVC/templating चौखटे में लागू पहले दो तरीकों में से दोनों को देखा है।

    django टेम्पलेट को भरने के लिए उपयोग किए जाने वाले चर के एक शब्दकोश को देखने के लिए पास करने वाली पहली विधि का उपयोग करता है।

    smarty दूसरी विधि का उपयोग करता है, एक स्मार्ट ऑब्जेक्ट बनाते हैं और कंटेनर में प्रत्येक गुण को मान निर्दिष्ट करते हैं।

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

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

    0

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

    नियंत्रक में:

    $this->view->myVar = 'test'; 
    

    और ध्यान में रखते हुए:

    $this->myVar; // 'test' 
    

    एक ही लेआउट के लिए चला जाता है के बाद से एक ही दृश्य वस्तु के दोनों अलग उदाहरण हैं:

    $this->layout->myVar = 'test'; 
    

    और उसके बाद लेआउट में:

    $this->myVar; // 'test' 
    

    ढांचा मालिकाना होता था, लेकिन आम जनता को जारी किया जा रहा है। यदि आपको लगता है कि इससे मदद मिलेगी तो मुझे आपको कुछ कोड भेजने में खुशी होगी। याद रखें, सबसे सरल जवाब आमतौर पर सबसे अच्छा जवाब है।

    +0

    यह वही है जो मैं अपने दूसरे उदाहरण में सोच रहा हूं। मैंने कोड उदाहरण को सरल रखा, इसलिए मैंने इस तथ्य को छोड़ दिया कि मेरे नियंत्रक के पास वास्तव में दृश्य का एक उदाहरण है, और इसलिए आप ठीक तरह से काम करेंगे जैसा कि आप सुझाव देते हैं: $ this-> view-> foo = 'bar' क्या बनाता है मुझे इस विकल्प के बारे में असहज है कि मेरे पास एक व्यू क्लास है जो एक ही मॉडल के 5 अलग-अलग विचार प्रस्तुत कर सकती है। प्रत्येक दृश्य में अपनी डेटा आवश्यकताएं हो सकती हैं। इसका मतलब है कि व्यू क्लास में गुणों का एक गुच्छा होगा, जिनमें से कुछ केवल किसी एक दृश्य के लिए प्रासंगिक होंगे। यह मुझे पसंद से कम साफ है। कोई सुझाव? –

    +0

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

    +0

    बस इसे बहुत पहले नहीं जारी किया http://europaphp.org/ – Tres

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