2011-02-03 13 views
5

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

बुनियादी लक्ष्यों में से कुछ,
- उपयोग पीएचपी वस्तु प्रक्रियात्मक के बजाय उन्मुखी।
- इस शैली के बारे में अधिक जानने के लिए एक एमवीसी या कुछ इसी तरह का उपयोग करें।
- हल्के और तेज/अच्छा प्रदर्शन

यहाँ रहो है मेरी योजना बनाई साइट संरचना, जावास्क्रिप्ट, छवियों, सीएसएस, कुछ सहायक कार्यों/फ़ाइलें, आदि के लिए कुछ अन्य फ़ोल्डरों को छोड़कर

/// ////////// साइट संरचना /////////////

site.com/ 
     /index.php 
site.com/library/ 
       /Config.class.php 
       /Photos.class.php 
       /Mail.class.php 
       /Filter.class.php 
       /QRcodes.class.php 
       /Router.class.php 
       /Database.class.php 
       /Templates.class.php 
       /etc, etc,etc...... 
site.com/modules/ 
       /account/ 
         /model 
         /views 
         /controllers 
       /users/ 
         /model 
         /views 
         /controllers 
       /messages/ 
         /model 
         /views 
         /controllers 
       /API/ 
         /model 
         /views 
         /controllers 
       /forums/ 
         /model 
         /views 
         /controllers 
       /blogs/ 
         /model 
         /views 
         /controllers 
       /etc, etc, etc, etc............. 
         /model 
         /views 
         /controllers 

मैं मार्ग में प्रवेश का एक बिंदु के माध्यम से सभी अनुरोध का फैसला किया है, index.php
मैं वाई एक राउटर क्लास/ऑब्जेक्ट का निर्माण करेगा जो नियमित अभिव्यक्तियों का उपयोग करके संभावित गंतव्यों के मानचित्र के खिलाफ यूआरआई से मेल खाएगा। यहाँ मैं इस हिस्से के लिए अब के लिए है का एक टुकड़ा ...

<?php 
//get url from URL 
$uri = isset($_GET['uri']) ? $_GET['uri'] : null; 

$uri_route_map = array( 
    //users/account like http://mysite.com/users/324 (any digit) 
    'users/friends/page-(?<page_number>\d+)' => 'modules/users/friends/page-$1', 
    'users/friends/edit/page-(?<page_number>\d+)' => 'modules/users/friends/edit/page-$1', 
    'users/friends/edit' => 'modules/users/friends/edit', 
    'users/friends/' => 'modules/users/friends/', 
    'users/online' => 'modules/users/online/' , 
    'users/online/page-(?<page_number>\d+)' => 'modules/users/online/page-$1', 
    'users/create' => 'modules/users/create', 
    'users/settings' => 'modules/users/settings', 
    'users/logout(?<page_number>\d+)' => 'modules/users/logout', 
    'users/login' => 'modules/users/login', 
    'users/home' => 'modules/users/home', 

    //forums 
    'forums/' => 'modules/forums/index', 
    'forums/viewthread/(?<id_number>\d+)' => 'modules/forums/viewthread/$1', 
    'forums/viewforum/(?<id_number>\d+)' => 'modules/forums/viewforum/$1', 
    'forums/viewthread/(?<id_number>\d+)/page-(?<page_number>\d+)' => 'modules/forums/viewthread/$1/page-$2', 
    'forums/viewforum/(?<id_number>\d+)/page-(?<page_number>\d+)' => 'modules/forums/viewforum/$1/page-$2', 

    // TESTING new method to define class and page better! 
    'users/home' => array('PAGE CLASS NAME', 'ACTION NAME') 

    //blog routes coming soon 
    //mail message routes coming soon 
    //various other routes coming soon 
); 

////////////////////////////////// 
class Router 
{ 
    public function __construct() 
    { 
    } 

    public function get_route($uri, array $uri_routes) 
    { 
     foreach ($uri_routes as $rUri => $rRoute) { 
      if (preg_match("#^{$rUri}$#Ui", $uri, $uri_digits)) { 
       //if page number and ID number in uri then set it locally 
       $page_number = (isset($uri_digits['page_number']) ? $uri_digits['page_number'] : null); 
       $id_number = (isset($uri_digits['id_number']) ? $uri_digits['id_number'] : null); 
       echo '<hr> $page_number = ' . $page_number . '<BR><hr> $id_number = ' . $id_number; 
       $uri = preg_replace("#^{$rUri}$#Ui", $rRoute, $uri); 
       echo '<BR><BR>Match found: ' . $uri_routes . '<BR><BR>'; 
       break; 
      } 
     } 
     $uri = explode('/', $uri); 
    } 
} 

$uri = new Router(); 
$uri = $uri->get_routes($_GET['uri'], $uri_route_map); 

?> 



कृपया ध्यान दें

कोड के ऊपर सभी परीक्षण कोड है और है बदल दिया जाएगा, यह केवल अवधारणा

एस ओ जैसा कि आप देख सकते हैं कि मैं index.php को यूआरआई प्राप्त करने की योजना बना रहा हूं, इसे वैध पथों के विरुद्ध जांचें, अगर कोई पाया जाता है, तो इसमें हेडर सेक्शन शामिल होगा या फिर निर्माण होगा, फिर सामग्री अनुभाग का निर्माण होगा, फिर आखिरकार पाद लेख पन्ना।

आप उदाहरण के लिए उपयोग करने के लिए थे, तो ... www.test.com/blogs/userid-32423/page-23

पेज होगा ...

  • निर्माण हैडर()
  • ऑब्जेक्ट ब्लॉग बनाएं ... $ ब्लॉग = नए ब्लॉग;
  • $ ब्लॉग-> viewbyID ($ userID, $ पेजिंग) पर कॉल करें; // $ userID 32423 होगा और $ पेजिंग अब पर अपने फ़ोल्डर संरचना आधारित यूआरआई
  • निर्माण पाद लेख अनुभाग

से 23 होगा। मेरा मानना ​​है कि हमारे उपर्युक्त उदाहरण में ब्लॉग क्लास फ़ाइल को CONTROLLER माना जाएगा। अगर मैं अभी तक सही हूं, तो ब्लॉग्स-> व्यूबीआईडी ​​(आईडी, पेज) को कॉल करने वाले ब्लॉग्स क्लाइंट को कुछ कोड सेट अप करेंगे, डेटाबेस से पूछेंगे और पृष्ठ के लिए कुछ चर सेट अप करेंगे और फिर इसमें एक ब्लॉग शामिल हो सकता है टेम्पलेट फ़ाइल।इस ब्लॉग टेम्पलेट फ़ाइल को VIEWS माना जा सकता है।

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

बोनस प्रश्न ... फॉर्म पोस्ट के बारे में, मुझे इन्हें कहां से संसाधित करना चाहिए? मेरे उदाहरण में मैं ब्लॉग मॉड्यूल पर ध्यान केंद्रित कर रहा हूं, इसलिए ब्लॉग प्रविष्टि संपादित करने के लिए नई ब्लॉग एंट्री और POST जोड़ने के लिए POST कहें, इन्हें संसाधित (मोडल, व्यू, कंट्रोलर) कहां से किया जाना चाहिए?

+3

'तैयार उत्पाद ... मैं ... अन्य परियोजनाओं को विकसित करने के लिए उपयोग कर सकता हूं ...' सभी निष्पक्षता में, आपको वास्तव में इसका उपयोग अपने गांठों को सीखने/लेने के लिए करना चाहिए, लेकिन केकपीएचपी, सिम्फनी जैसे व्यावसायिक रूप से विकसित उत्पाद के साथ जाना चाहिए , कोडइग्निटर, ज़ेंड या अन्य अच्छी तरह से प्रयुक्त और दस्तावेज समाधानों में से एक। :) –

उत्तर

5

होगा नियंत्रक का काम उपयोगकर्ता के इनपुट की जांच करने और निर्धारित क्या अनुरोध किया जा रहा है के लिए है। एक बार यह निर्धारित हो जाने पर, मॉडल (ओं) को बुलाया जाता है। नियंत्रक तब मॉडल का पेलोड लेता है और इसे दृश्य में देता है।

मूल रूप से, मॉडल मॉडल व्यवसाय का मॉडल है। ब्लॉग पोस्ट जोड़ना चाहते हैं? फिर ब्लॉग मॉडल में ->add या विधि होगी (जिसे नियंत्रक द्वारा बुलाया जाता है। ब्लॉग नियंत्रक के पास add विधि भी हो सकती है, लेकिन यह डेटाबेस से बात करने के लिए नहीं है। यह इनपुट की जांच करने और फिर मॉडल को कॉल करने के लिए है वास्तविक बचत करें)। मॉडल विधियां हमेशा डेटाबेस के साथ बातचीत नहीं करती हैं लेकिन वे आमतौर पर करते हैं।

जहां तक ​​जोड़ें/संपादित करें, वे लगभग हमेशा एक ही दृश्य साझा करते हैं और कर योग्य होने पर समान नियंत्रक विधियों को साझा कर सकते हैं।

बस याद रखें कि नियंत्रक आपके सभी ग्राहकों के लिए प्रवेश बिंदु है। प्रत्येक यूआरएल आपके यूआरएल हैंडल को कंट्रोलर विधि में मैप करना चाहिए। नियंत्रक तब मॉडल को बताता है कि उपयोगकर्ता इनपुट को पास करने के लिए क्या करना है।

+0

धन्यवाद इसने मुझे अंततः "इसे प्राप्त करने" के लिए एक लंबा समय लगाया है, लेकिन मुझे लगता है कि मुझे अब मिल गया है – JasonDavis

3

आपके मॉडल डेटाबेस को क्वेरी करने वाले एक व्यक्ति होना चाहिए, न कि आपके नियंत्रक। आपका मॉडल सभी CRUD क्रियाओं को संभालने के लिए है, जहां आवश्यक हो, दृश्य को वापस देखने के लिए नियंत्रक को परिणाम पास करें। सामान्य प्रवाह

Controller > Model > Controller > View 
संबंधित मुद्दे