2011-10-01 7 views
6

मुझे कोडनिर्देशक मार्गों में कोई समस्या है। मैं चाहता हूं कि मेरी साइट पर सभी पंजीकृत उपयोगकर्ताओं को अपनी "निर्देशिका" मिल जाए, उदाहरण के लिए: www.example.com/username1, www.example.com/username2। यह "निर्देशिका" नियंत्रक "पोलिका", विधि "ogled", पैरामीटर "username1" पर मैप करना चाहिए।कोडनिर्देशक में रूट - स्वचालित रूप से

यदि मुझे ऐसा लगता है, तो प्रत्येक नियंत्रक को इस मार्ग पर मैप किया जाता है: "पोलिका/ओग्लेड/पैरामीटर"। यह ठीक नहीं है:

$route["(:any)"] = "polica/ogled/$1"; 

यह काम करता है, लेकिन मैं हमेशा मैन्युअल routes.php में जानकारी दर्ज किया है:

$route["username1"] = "polica/ogled/username1"; 

कैसे मैं ऐसा है कि इस स्वचालित किया जाएगा?

अद्यतन: उदाहरण के लिए, मैं नाम ads साथ नियंत्रक की है। उदाहरण के लिए, यदि आप www.example.com/ads/ पर जाते हैं तो सूचीबद्ध विज्ञापन होंगे। यदि आप www.example.com/username1 पर जाते हैं तो उपयोगकर्ता username1 द्वारा सूचीबद्ध विज्ञापन हैं। वहाँ भी नियंत्रक user, profile, latest ... है

मेरे वर्तमान routes.php:

$route['oglasi'] = 'oglasi'; 
$route['(:any)'] = "polica/ogled/$1" 
$route['default_controller'] = 'domov'; 
$route['404_override'] = ''; 

मैं इस कोड के साथ समस्या हल:,

$route['oglasi/(:any)'] = 'oglasi/$1'; 
$route['(:any)'] = "polica/ogled/$1" 
$route['default_controller'] = 'domov'; 
$route['404_override'] = ''; 

सादर मारियो

+0

शानदार! मैंने इसे डिफ़ॉल्ट नियंत्रक के साथ किया और यह वहां भी काम करता है। –

उत्तर

23

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

1) आप चुनिंदा पुन: रूट अपने सभी साइटों नियंत्रक को व्यक्तिगत रूप से, की तरह कर सकते हैं:

$route['aboutus'] = "aboutus"; 
$route['where-we-are'] = "whereweare"; 
//And do this for all your site's controllers 
//Finally: 
$route['(:any)'] = "polica/ogled/$1"; 

इन सभी मार्गों किसी भी करने से पहले, आना चाहिए, क्योंकि वे में पढ़ा जाता है वे आदेश प्रस्तुत किए जाते हैं, और यदि आप इसे रखते हैं: शुरुआत में कोई भी यह खुशी से बाकी सभी को छोड़ देगा। टिप्पणी के बाद

संपादित करें:

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

मुझे पता है कि यह एक कोड शब्दशः है, लेकिन वे निश्चित रूप से 6K से कम होंगे जैसा आपने कहा था। चूंकि मुझे आपके यूआरएल और आपके वेब एप्लिकेशन की वास्तविक संरचना नहीं पता है, इसलिए यह एकमात्र समाधान है जो मेरे दिमाग में आता है।आप इस तरह के अपने ऐप की नियमित यूआरएल आकार के हैं के रूप में आगे जानकारी प्रदान करते हैं, तो मैं अपने जवाब को अपडेट कर सकते

/अंत संपादित

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

या

2) आप अपने डिजाइन पैटर्न थोड़ा उपयोगकर्ता नाम के लिए एक और मार्ग, कुछ

$route['user/(:any)'] = "polica/ogled/$1"; 

यह की रेखा के साथ बदल सकते हैं और आवंटित काफी सुंदर (और अर्थ) यूआरएल उत्पन्न होगा फिर भी, और अन्य मार्गों से बचने की सभी परेशानी से बचेंगे।

+0

आपके उत्तर के लिए धन्यवाद। मैं आपके दूसरे समाधान का उपयोग नहीं कर सकता क्योंकि मेरा ग्राहक डोमेन नाम के बाद उपयोगकर्ता नाम रखना चाहता है।मैं आपका पहला समाधान नहीं समझता। क्या आप कृपया मेरे मामले में मुझे समझा सकते हैं? मेरा लक्ष्य है, इस समस्या को कम कोड के साथ हल करने के लिए। अब, मेरे पास मेरी 'routes.php' फ़ाइल में लगभग 6000 पंक्तियां हैं - मुझे यह पसंद नहीं है:/ – Puzo

+0

@Puzo मैंने पहले समाधान के कुछ स्पष्टीकरण के साथ अपना उत्तर अपडेट किया। और हाँ, 6000 मार्ग निश्चित रूप से बहुत अधिक हैं। –

+0

मैंने अपना पहला पोस्ट - प्रश्न अपडेट किया .. क्या आपको अधिक जानकारी चाहिए? किस प्रकार? – Puzo

1

मैं हाल ही में इसी समस्या से जूझ रहा था। मैंने कुछ ऐसा बनाया जो मेरे लिए इस तरह काम करता है:

remap विधि के साथ "रीडायरेक्ट" नियंत्रक को परिभाषित करें। यह आपको किसी फंक्शन में किसी भी कार्यवाहक चर स्ट्रिंग के साथ contoller को भेजे गए अनुरोधों को इकट्ठा करने की अनुमति देगा। इसलिए यदि http://yoursite/jeff/ या http://yoursite/jamie पर कोई अनुरोध किया गया है तो यह उन विधियों को नहीं मार पाएगा बल्कि इसके बजाय http://yoursite/ रीमेप फ़ंक्शन दबाएगा। (भले ही वे विधियां/नाम मौजूद न हों और यहां तक ​​कि यदि आपके पास इंडेक्स फ़ंक्शन है, तो यह इसे पीछे छोड़ देता है)। _Remap विधि में आप एक सशर्त स्विच को परिभाषित कर सकते हैं जो तब आपके शेष कोड के साथ काम करता है जो उपयोगकर्ता को किसी भी तरह से निर्देशित करता है।

फिर आप डिफ़ॉल्ट के रूप में इस फिर से प्रत्यक्ष नियंत्रक को परिभाषित करने और इसलिए की तरह अपने रूट सेट करना चाहिए:

$route['(.*)'] = "redirect/index/$1"; 
$route['default_controller'] = "redirect"; 

यह एक समस्या के पहले थोड़ा पर है क्योंकि इस मूल रूप से सब कुछ के लिए बाध्य करेगा फिर से किया जाना है इस नियंत्रक को निर्देशित किया गया कोई फर्क नहीं पड़ता कि आखिरकार इस _remap स्विच के माध्यम से क्या।

लेकिन आप जो कर सकते हैं वह उन नियमों/मार्गों को परिभाषित करता है जिन्हें आप उन मार्गों के बयान के ऊपर इस शर्त का पालन नहीं करना चाहते हैं।

यानी

$route['myroute'] = "myroute"; 
$route['(.*)'] = "redirect/index/$1"; 
$route['default_controller'] = "redirect"; 

मैंने पाया कि यह एक अच्छा सिस्टम मैं के रूप में परिभाषित कर रहे हैं के रूप में कई चर उपयोगकर्ता हो सकते हैं जहां जहां मैं आसानी से क्या वे एक नियंत्रक के माध्यम से के लिए खड़े के आधार पर उन्हें पुन: निर्देशित कर सकती हूं पैदा करता है।

+0

हम्म .. तो अगर मैं सही ढंग से समझता हूं, तो मुझे अपने सभी नियंत्रकों को 'routes.php' फ़ाइल में परिभाषित करना चाहिए और फिर नीचे मैं रीडायरेक्ट नियम को परिभाषित करता हूं? पेज के प्रदर्शन पर इसका असर पड़ता है? – Puzo

+0

@Puzo अपनी टिप्पणी पढ़ना, यह मेरे उत्तर में जो कुछ कहना है, वह काफी है .. –

+0

@Chamilyan मैं रूटिंग के साथ यूआरएल में # के साथ कैसे बदल सकता/सकती हूं – Bugfixer

1

एक और तरीका है अपने intenal नियंत्रकों के साथ एक सरणी घोषित किया जाएगा और CodeIgniter से अपने routes.php फ़ाइल में इस तरह उपयोगकर्ता नियंत्रक से सब कुछ अनुप्रेषित:

$controllers=array('admin', 'user', 'blog', 'api'); 
if(array_search($this->uri->segment(1), $controllers)){ 
    $route['.*'] = "polica/ogled/$1"; 
} 
संबंधित मुद्दे