2012-03-24 21 views
5

मैं कुछ इस टिप्पणी विचार से Code Igniter Controller/Model name conflictsCodeigniter नियंत्रक और एक ही नाम collison साथ मॉडल

खोज वर्ग के नाम चर पर कोर/CodeIgniter.php कोशिश:

$class = $RTR->fetch_class(); और इस तरह बदलने के लिए:
$class = 'Controller' . $RTR->fetch_class();

class ControllerUser extends CI_Controller { ...

:

अब नियंत्रक नाम बदल

यह काम करता है, अब मैं उपयोगकर्ता मॉडल और उपयोगकर्ता नियंत्रक का उपयोग कर सकता हूं। लेकिन मेरा सवाल है, क्या यह समझ में आता है? या समस्या है? (क्षमा करें मेरी खराब अंग्रेजी)

+0

यही कारण है कि आपको एक फ्रेमवर्क खोजने का प्रयास करना चाहिए जो आपको PHP5.3 [नेमस्पेस] (http://php.net/manual/en/language.namespaces.php) के साथ काम करने देता है। जितना मैं उस ढांचे से नफरत करता हूं, FuelPHP आपके लिए तार्किक कदम हो सकता है। इसकी काफी नई सीआई कांटा। हां, ज़ाहिर है, अगर आपके पास कोई ढांचा है जिसका ढांचा उपयोग किया जाता है या आप उस चरण में हैं जहां यह संभव है। यदि नहीं .. तो जब आप अगली परियोजना उठाते हैं तो इसे ध्यान में रखें। –

+0

पता नहीं है कि आप FuelPHP से विचार कहां प्राप्त करते हैं सीआई का एक कांटा है। ऐसा नहीं है, स्क्रैच से बनाया गया था, सीआई के साथ कुछ भी सामान्य नहीं है, और यह संगत नहीं है। – WanWizard

उत्तर

5

इस समस्या के समाधान पाने के लिए, सामान्य रूप से ज्यादातर लोगों को मॉडल वर्ग नाम के आगे '_model' प्रत्यय जोड़ने

मुझे लगता है कि यह बजाय नियंत्रकों के लिए एक प्रत्यय जोड़ना है, क्योंकि वे लगभग अपने वर्ग द्वारा संदर्भित कभी नहीं कर रहे हैं बेहतर है आपके कोड में नाम।

सबसे पहले हमें राउटर क्लास का विस्तार करने की आवश्यकता है। "Application/पुस्तकालयों/MY_Router.php"

class MY_Router extends CI_Router { 
    var $suffix = '_controller'; 

    function __construct() { 
     parent::CI_Router(); 
    } 

    function set_class($class) { 
     $this->class = $class . $this->suffix; 
    } 

    function controller_name() { 

     if (strstr($this->class, $this->suffix)) { 
      return str_replace($this->suffix, '', $this->class); 
     } 
     else { 
      return $this->class; 
     } 

    } 
} 

अब संपादित करें "प्रणाली/CodeIgniter/CodeIgniter.php"

लाइन 153:

if (! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->controller_name().EXT)) 

लाइन

इस फ़ाइल बनाएँ 158:

include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->controller_name().EXT); 

बगल में, संपादित: "प्रणाली/पुस्तकालयों/Profiler.php", लाइन 323:

$output .= " 
<div style="color:#995300;font-weight:normal;padding:4px 0 4px 0">".$this->CI->router->controller_name()."/".$this->CI->router->fetch_method()."</div>"; 

Source

+0

की सख्ती से बोली जाने वाली संपत्तियां काम नहीं कर रही हैं। 404 नहीं मिला। – musa

+0

@musa, जो एचएमवीसी समाधान के साथ था, मेरा संपादन जांचें और – Starx

+0

अपडेट करें, यह 'parent :: __ निर्माण()' नहीं होना चाहिए? चूंकि PHP5 में निर्माण करने के तरीके में बदलाव आया है ... फिर फिर सीआई अभी भी सेमी-पीएच 4 फ्रेमवर्क है। –

1

यूप यह संवेदना बनाता है। कोडनिर्देशक एक सख्त ऑब्जेक्ट ओरिएंटेड ढांचा है। इसका अर्थ यह है कि जब आपके पास एक ही नाम के साथ 2 या अधिक ऑब्जेक्ट होते हैं, तो ऑब्जेक्ट का नाम पर्याप्त अद्वितीय नहीं होता है।

आपके मामले में एक मॉडल डेटा प्रोसेसर और एक नियंत्रक वर्ग है जो आपके दृश्य को मॉडल से जोड़ता है। तो तार्किक रूप से आप यह कुछ इस तरह उसे नाम देना होगा:

आपका मॉडल होगा: "Model_User", "Db_User" या "UserList"

आपका नियंत्रक हो जाएगा: "उपयोगकर्ता", Controller_User या UserController

मॉडल के मामले में मेरा सुझाव है कि आप डीबी_यूसर (लघु लेकिन स्पष्ट नाम) का उपयोग करें और नियंत्रकों के मामले में मेरा सुझाव है कि आप "उपयोगकर्ता" का उपयोग करें (लघु और कक्षा जो उपयोगकर्ता के साथ मॉडल को जोड़ती है और उस उपयोगकर्ता के लिए देखती है)

मुझे अपने कोडिनेटर सिस्टम का उपयोग करने में कभी समस्या नहीं है जैसे

+0

मैं बहुवचन का उपयोग नहीं कर रहा हूं क्योंकि मैं एक सूची या एक टेबल के बारे में बात कर रहा हूं। उदाहरण के लिए उपयोगकर्ता सूची –

7

मैं CodeIgniter के मूल को संशोधित नहीं होगा। जब आप अपग्रेड करते हैं, तो आप उस परिवर्तन को खो देंगे।

मैंने अतीत में दो चीजें की हैं: 1. मेरे मॉडल नामित उपयोगकर्ता_मोडेल 2. मेरे नियंत्रकों को बहुवचन के रूप में नामित किया गया, और मेरे मॉडल एकवचन के रूप में नामित किए गए।

मैं बाद वाला करता हूं। यह अर्थपूर्ण रूप से भी समझ में आता है, क्योंकि नियंत्रक का नाम यूआरएल में है, इसलिए पथ app_path/उपयोगकर्ता/उपयोगकर्ता नाम की तरह दिखते हैं। इसके अलावा, मॉडल आमतौर पर एक एकल उपयोगकर्ता मॉडल करता है, जिससे यह भी समझ में आता है।

आप भी इस सवाल यहाँ पर समुदाय से कुछ विचार-विमर्श कर सकते हैं: http://codeigniter.uservoice.com/forums/40508-codeigniter-reactor/suggestions/1269847-controller-prefixes

+0

मैं डेटामैपर का उपयोग कर रहा हूं, इसलिए मैं User_model नहीं बनाना चाहता हूं। लेकिन हाँ, मॉडल उपयोगकर्ता, नियंत्रक उपयोगकर्ता हो सकते हैं। मुझे यह भी मिला http://phpfour.com/blog/2009/09/codeigniter-controller-naming-convention-modified/ आपको क्या लगता है? – musa

+0

जहां तक ​​# 2 चला जाता है, इस प्रकार अब तक समझ में आता है, और मुझे लगता है कि यह थोड़ा और अधिक एसईओ अनुकूल है, लेकिन उस पर अधिक संदर्भ प्राप्त करना चाहते हैं। – Jahmic

1

आप क्यों नहीं बस अपने नियंत्रकों विलक्षण बनाने के लिए और अपने मॉडल/db टेबल बहुवचन न?

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