2011-09-07 16 views
5

में एक नियंत्रक में मॉडल को लोड करने के लिए कैसे मैं मुख्य रूप से सीखने की प्रक्रिया के लिए हल्के एमवीसी बनाने पर काम कर रहा हूं, लेकिन मैं इसे अंततः उपयोग करने के लिए पर्याप्त होना चाहता हूं।एमवीसी

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

1) मुझे अपने मॉडल कक्षाओं के अंदर डेटाबेस/कैश/आदि से डेटा प्राप्त करने की आवश्यकता है, मुझे बस अपने मॉडल को मेरे उदाहरण नियंत्रक में लोड करने के तरीके की सहायता चाहिए, आप देख सकते हैं कि मैंने इसे जोड़ा है $profileData = $this->model->getProfile($userId) से नीचे जो अभी बनाया गया है और अस्तित्व में नहीं है, मैं काम करने के लिए ऐसा कुछ कैसे प्राप्त कर सकता हूं? या क्या मुझे कक्षा में मॉडल को अलग तरीके से लोड करना चाहिए?

2) बहुत से पृष्ठों को उपयोगकर्ता को साइट पर लॉग इन करने की आवश्यकता होगी। क्या मैं नियंत्रक में नीचे उस भाग को संसाधित कर सकता हूं यह जांचने के लिए कि कोई उपयोगकर्ता लॉग इन है या नहीं, उदाहरण के लिए, प्रोफाइल पेज बनाने से पहले, जांचें कि उपयोगकर्ता लॉग इन है या नहीं, तो इसके बजाय लॉगिन पेज बनाएं और प्रत्येक नियंत्रक विधि के अंदर इन चेक को जोड़ें /पृष्ठ?

/** 
* Example Controller 
*/ 
class User_Controller extends Core_Controller { 

    // domain.com/user/id-53463463 
    function profile($userId) 
    { 
     //GET data from a Model 
     $profileData = $this->model->getProfile($userId); 

     $this->view->load('userProfile', $profileData); 
    } 

    // domain.com/user/friends/ 
    function friends() 
    { 
     //GET data from a Model 
     $friendsData = $this->model->getFriendlist(); 

     $this->view->load('userFriends', $friendsData); 
    } 
} 

कोर

abstract class Core_Controller { 
    protected $view; 
    protected $model; 

    function __construct(DependencyContainer $dependencyContainer){ 
     $this->view = new Core_View(); 
     //$this->view = $dependencyContainer->get(view); 


    } 
} 

उत्तर

2

संभवतः तरीके पूरा करने के लिए आप क्या कर रहे हैं की टन कर रहे हैं।

"सबसे आसान" शायद निर्माता को ओवरराइड करने और सीधे मॉडल को तुरंत चालू करने के लिए है।

User_Controller में

:

public function __construct(DependencyContainer $dc) { 
    parent::__construct($dc); 

    $this->model = new User_Model(); 
} 

मेरा अनुमान है कि यह है कि आप कुछ करने के लिए एक छोटे से अधिक स्वचालित हालांकि देख रहे हैं। यदि आप मॉडल को नियंत्रक माइनस "_Controller" के समान नाम रखना चाहते हैं, तो बस कन्स्ट्रक्टर में get_class ($ this) का उपयोग करें और आप जो चाहते हैं उसे पार्स करने के लिए PHP के स्ट्रिंग फ़ंक्शंस का उपयोग करें। एक बार जब आप किया है कि एक चर में, आप मॉडल का दृष्टांत है कि चर का उपयोग कर सकते हैं:

Core_Controller में

:

public function __construct(DependencyContainer $dc) { 
    $this->view = new Core_View(); 

    // $model_class should be 'User_Model' now 
    $model_class = str_replace('_Controller', '_Model', get_class($this)); 

    // now instantiate the model 
    $this->model = new $model_class(); 
} 

मैं वास्तव में किसी भी ढांचे केवल एक मॉडल प्रत्येक के साथ जुड़े हो सकता है के साथ काम नहीं किया नियंत्रक (केकेपीएचपी को छोड़कर? मुझे याद नहीं है)। सिम्फनी के साथ, मॉडल और नियंत्रक पूरी तरह से decoupled हैं ताकि आप किसी भी नियंत्रक के साथ किसी भी मॉडल का उपयोग कर सकते हैं। आप मॉडल को आवश्यकता के अनुसार तुरंत चालू करें। Symfony, उदाहरण के लिए, सिद्धांत ORM उपयोग करती हैं इसलिए एक नियंत्रक कार्रवाई में यदि आप एक मॉडल आप कुछ इस तरह करना होगा की जरूरत:

$model = Doctrine::getTable('User'); 

यह आदेश को बढ़ावा देने के एक decoupled में ऐसे ही अधिक एक डिजाइन पर विचार करना सार्थक हो सकता है डिजाइन और मैं वादा कि आप किसी बिंदु पर कुछ नियंत्रक में एक से अधिक मॉडल चाहते हैं।

2.) प्रमाणीकरण तक। कुछ ऐसा लगता है जो काफी आम है, किसी प्रकार की सेटिंग (चाहे कॉन्फ़िगरेशन फ़ाइल या सदस्य चर में) हो, जो कहती है कि वर्तमान कार्रवाई को उपयोगकर्ता को प्रमाणित करने की आवश्यकता है या नहीं। जब भी कार्रवाई चलती है तो यह संसाधित होता है (वाईआई इन प्रकार के चीजों को फ़िल्टर करता है)। यदि उपयोगकर्ता को लॉग इन करने की आवश्यकता है, तो वह उस पृष्ठ को संग्रहीत करता है जिसे वे एक्सेस करने का प्रयास कर रहे हैं, और फिर उन्हें लॉग इन पेज पर रीडायरेक्ट करते हैं (आपको केवल एक बनाना होगा)। एक बार जब वे सही तरीके से प्रमाणीकृत हो जाएंगे, तो यह उनको वापस भेज देगा जहां वे मूल रूप से आगे बढ़ रहे थे।

+0

विचारों के लिए धन्यवाद, और आप सही हैं कुछ नियंत्रक की इच्छा अधिकतर 1 मॉडल की आवश्यकता है, खासकर जब एक सोशल नेटवर्क प्रकार साइट बनाते हैं। – JasonDavis

+0

हाँ, ऊपर दिए गए उदाहरण के साथ एक और नुकसान यह है कि जब भी आपको इसकी आवश्यकता न हो, तब भी आप मॉडल को तुरंत चालू करें। यह शायद एक बड़ा सौदा नहीं है, लेकिन यह ध्यान देने योग्य है कि आप कुछ अनुरोधों पर अतिरिक्त काम कर रहे हैं। – gregghz