2012-12-19 14 views
10

जब मैंने सवाल पूछा तो मैं बहुत नींद में था, इसलिए इसके लिए खेद है, वैसे भी चीजों को स्पष्ट करने के लिए मैंने 2 घंटे के लिए सवाल तैयार किया।व्यू, टेम्पलेट और कंट्रोलर और मॉडल शुरू करना वैकल्पिक है

मैं अपने कोड को व्यवस्थित करने के कोशिश कर रहा हूँ और व्यवस्थित करने के लिए यह mvc'ish (MVC की तरह), मैं अगर मैं सभी सिद्धांतों का पालन कर सकते हैं पता नहीं है फैसला किया, लेकिन मैं कम से कम करीब बनना चाहता था उस से।

मेरे आवेदन में एक फ्रंट-कंट्रोलर है (अगर मेरी परिभाषा सही है तो मुझे पता है), ताकि मेरे आवेदन के सभी http-request मेरे बिंदु की स्थिति में index.php मेरे मामले में गुजर रहे हों ।

यह कहकर कि मैंने इसे इस तरह स्थापित किया है, आप कल्पना कर सकते हैं कि मैंने .htaccess का उपयोग सभी अनुरोधों को index.php पर निर्देशित करने के लिए किया था।

मैंने url विस्फोट किया और इस तरह से एक सरणी बनाई, $url[] ऐसा ही।

$file = $controller_path . $page . '_controller.php'; 

if (file_exists($file)) { 
    require $file; 
    $class_name = ucfirst($page) . '_controller'; 
    $target = new $class_name(); 
} 

भी मैं इसे एक कंटेनर, 'डेकोरेटर पैटर्न' में लपेट: तो जब भी मैं इस http://localhost/app/pagename की तरह मेरे ऐप्स को एक्सेस यह एक नियंत्रक (pagename_controller)

मैं इसे इस तरह से किया था तक पहुँचने हो जाएगा , भविष्य के उपयोग के लिए, सत्यापन शायद। इस तरह:

$controller = new Wrap($target); 
$controller->index(); 

अगर $controller चर नाम के उपयोग के लिए उपयुक्त है तो कृपया मुझे माफ कर दो, जब यह सब गलत है मैं नहीं जानता।

मैं थोड़े लगता है कि मैं सेटअप इस तरह अपने आवेदन कर सकते हैं:

  1. उपयोगकर्ता, कैसे एक अनुरोध भेजता है? अनुप्रयोग का उपयोग भी तरह से वह/वह एक http अनुरोध द्वारा भेजी गई, कि आवेदन

    credit : phparchitect design patterns

की प्रारंभिक अवस्था से लोड होगा तुम मेरे वांछित आवेदन संरचना के चित्र में देख सकते हैं, मैं केवल पहला भाग करने में सक्षम था जो एक ही प्रविष्टि (index.php)

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

इस पल के रूप में, मेरे पास 3 फाइलें हैं जिन्हें मैं सेटअप करना चाहता हूं, लेकिन मैं इस पर उलझन में हूं।

index_controller, index_view, Template

class Index_controller { 
    private $model; 
    private $view; 

    public function __construct(){ 
     // optional model -> $this->model = 'index' 
     $this->view = 'index' // 
    } 

    public function index(){ 
     $this->load->view($this->view) 
    } 
} 

class Index_view { 
    private $model; 
    private $template; 

    public function __construct(Model $model = null){ 
     $this->template = new Template('default'); 
    } 

    public function view() { 
     $this->template->assign('css', 'default_css'); // don't know if this is efficient 
     // or $this->template->assign('header', 'default_header'); 
     // or $this->template->assign('sidebar', 'default_sidebar'); 
     // or $this->template->assign('footer', 'default_footer'); 
     // or any other things I want to use in the template 
    } 
} 

class Template { 

    public $data = array(); 
    private $tmpl; 

    public function __construct($template) { 
     $this->tmpl = $template . '_tmpl.php'; 
    } 

    public function assign($name, $value){ 
     $this->data[$name] = $value; 
    } 

    // public function output 
    // function that will explode the data array and render it out as a webpage 
    // I'll create templates and 
} 
कि हाथ में साथ

, मैं अब पता है कि कैसे मैं उन चीजों को एक साथ लिंक करना चाहती। फिलहाल मेरे पास system फ़ोल्डर है जिसमें कक्षाएं हो सकती हैं, और मैंने उस फ़ोल्डर के लिए एक ऑटोलोडर सेट किया है।

मैं Controller वर्ग और View कक्षा बनाने की सोच रहा हूं जो आरेख में चित्रित एक्शन फैक्ट्री और व्यूफैक्टरी के रूप में कार्य करता है, हालांकि मुझे पता है कि ये उनकी जिम्मेदारियां नहीं हैं।

मैं इस की सोच रहा हूँ:

class Controller { 

    protected $load; 
    public function __construct() { 
     $this->load = new View(); 
    } 
} 

class View { 
    public function __construct() { 
    // some things i don't know 
    } 

    public function view() { 
    // some things i don't know 
    } 
} 

क्या अपने सुझाव और मेरे सेटअप में टिप्पणी कर रहे हैं। मैं ट्रायड कैसे शुरू कर सकता हूं?

+0

यह स्पष्ट नहीं है कि आपका वास्तविक प्रश्न क्या है।क्या आप विशिष्ट प्रश्नों के एक सेट से पूछने के लिए अपनी पोस्ट अपडेट कर सकते हैं? – Charles

+0

संपादित, मैंने इसे बहुत स्पष्ट बना दिया और मैंने इसे भी आजमाया –

+0

@JoeySalacHipolito क्या आप '$ पृष्ठ' को मान्य कर रहे हैं? यदि नहीं, तो आपके पास स्थानीय फ़ाइल समावेशन भेद्यता है, 'file_exists()' इसे रोक नहीं पाएगी। – MrCode

उत्तर

1

ठीक है, चलो अपने कार्यान्वयन विवरण पर अटक न जाएं। आप किसी अन्य समय अपने ढांचे को सुरक्षित करने के बारे में पढ़ सकते हैं। आइए आपके प्रश्न से निपटें ...

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

मेरी दुनिया में मैं भी मॉड्यूल, इसलिए बुनियादी रूटिंग योजना

Module -> Controller -> Action 

है इन तीन आइटम है कि फैशन में मेरी URI योजना के लिए नक्शे की है। चर भी तरह संलग्न किया जा सकता ...

http://www.domain.com/module/controller/action/var1/val1/var2/val2

तो, क्या पार्स किया गया है यूआरआई के बाद होता है, और नियंत्रण उचित नियंत्रक और कार्रवाई करने के लिए पर पारित किया जाता है? चलो कुछ कोड एक साधारण उदाहरण प्रदर्शित करने के लिए बना ...

<?php  
    class indexController extends Controller { 

     protected function Initialize() { 
      $this->objHomeModel = new HomeModel; 

      $this->objHeader = new Header(); 
      $this->objFooter = new Footer(); 

      $this->objHeader 
       ->SetPageId('home'); 
     } 

     public function indexAction() { 
      $this->objHeader->SetPageTitle('This is my page title.'); 
     } 
    } 
?> 

Initialize विधि में, मैं कुछ नियंत्रक चौड़ा सामान सेट कर रहा हूं, और बाद में उपयोग करने के लिए मेरे मॉडल का एक उदाहरण हथियाने। असली मांस indexAction विधि में है। यह वह जगह है जहां आप अपने दृश्य में उपयोग करने के लिए सामान स्थापित करेंगे। उदाहरण के लिए ...

public function randomAction() { 
    $this->_CONTROL->Append($intSomeVar, 42); 
} 

_CONTROL मूल्यों है कि मैं में हेरफेर और देखें पर पारित की एक सरणी है। Controller कक्षा जानता है कि व्यू के लिए सही टेम्पलेट कैसे ढूंढें क्योंकि इसका नाम एक्शन (और एक भाई निर्देशिका में) के नाम पर रखा गया है।

Controller माता पिता वर्ग कार्रवाई विधि का नाम लेता है और इसलिए है कि यह पार्स करता है ...

indexAction -> index.tpl.php 

तुम भी उदाहरण के लिए, यहाँ कुछ अन्य मज़ेदार चीज़ों के कर सकते हैं ...

Application::SetNoRender(); 

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

अन्त में, नियंत्रक, मॉडल, और विचारों का सब तो जैसे अपने स्वयं निर्देशिका के अंदर रहते हैं ...

my_module 
    controllers 
     indexController.class.php 
     someotherController.class.php 
     : 
     : 
    models 
     HomeModel.class.php 
     : 
     : 
    templates 
     index.tpl.php 
     someother.tpl.php 
     : 
     : 

मैं पर जा सकते हैं, लेकिन मैं स्मृति से लिख रहा हूँ, और वहाँ कुछ कर रहे हैं यहाँ और वहां झुर्री, लेकिन उम्मीद है कि यह आपको विचार के लिए भोजन देता है।

+0

होगा हालांकि एक उदाहरण हालांकि, आपकी 'प्रारंभ()' विधि नई ऑब्जेक्ट्स को एक केंद्र छोड़कर बना रही है। आईओसी सिद्धांत की ओर निर्भरता इंजेक्शन या शिक्षा की आवश्यकता यहां एक साइड-नोट के रूप में की जाती है। – Jimbo

+0

एक शब्द: "सिंगलटन", बेबी! –

+0

मुझे आशा है कि आपका मतलब है "कभी भी सिंगलेट का उपयोग न करें"। या उस मामले के लिए स्थैतिक तरीकों;) – Jimbo

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