2015-10-07 15 views
10

मैं आशा करता हूं कि किसी यूआरएल से अधिक खंडों हो सकता है के लिए डायनेमिक रूटिंग के साथ बाहर मेरी मदद कर सकते हैं। मैं पूरे वेब पर कुछ खोज कर रहा हूं, लेकिन मुझे कुछ भी नहीं मिला जो मुझे मेरी विशिष्ट स्थिति से बाहर करने में मदद करता है।गतिशील रूटिंग में Laravel 5 आवेदन

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

मैं वर्तमान में Laravel (5.1) का उपयोग करते हुए इस सीएमएस पैकेज के पुनर्निर्माण पर काम कर रहा हूँ [मैं Laravel सीख रहा हूँ, जबकि]। पैकेज के नए संस्करण में मेरे पेज मॉड्यूल के साथ आगे बढ़ने से पहले मुझे रूटिंग स्थिति को समझने की आवश्यकता है।

मुझे पता है कि मैं कुछ की तरह कर सकते हैं ...

// routes.php 
Route::get('{slug}', ['uses' => '[email protected]']); 

// PageController.php 
class PageController extends Controller 
{ 
    public function view($slug) 
    { 
     // do a query to get the page by the slug 
     // display the view 
    } 
} 

और यह अगर मैं नेस्टेड पृष्ठों की अनुमति नहीं दी है, लेकिन मैं ऐसा काम करेगा। और मैं केवल माता-पिता के आधार पर स्लग की विशिष्टता को लागू करता हूं। तो वहाँ फारगो के स्लग के साथ एक से अधिक पृष्ठ ...

  • स्थानों/फारगो
  • कर्मचारियों हो सकता है/फारगो

पैकेज है कि मैं CodeIgniter का उपयोग कर बनाया के साथ के रूप में, मैं प्रदर्शित करने के लिए सही पृष्ठ खोजने के लिए अतिरिक्त डेटाबेस लुकअप से बचने में सक्षम होना चाहते हैं।

मेरे प्रारंभिक सोचा एक कॉन्फ़िग फ़ाइल है कि गतिशील मार्गों के लिए होता है जैसे मैं प्रणाली के पुराने संस्करण के साथ किया था बनाने के लिए किया गया था। मार्ग केवल विशिष्ट समय पर बदल जाएंगे (जब पृष्ठ बनाया जाता है, जब स्लग संशोधित होता है, जब माता-पिता बदल जाता है), तो "कैशिंग" उन्हें बहुत अच्छा काम करेगा। लेकिन मैं अभी भी लार्वेल के लिए नया हूं, इसलिए मुझे यकीन नहीं है कि इसके बारे में जाने का सबसे अच्छा तरीका क्या होगा।

मुझे लगता है कि निम्नलिखित मार्गों काम यह पता लगाने के लिए प्रबंधन किया था। लेकिन क्या यह इसे स्थापित करने का सबसे अच्छा तरीका है?

Route::get('about/foobar', function(){ 
    return App::make('\App\Http\Controllers\PageController')->callAction('view', [123]); 
}); 

Route::get('foobar', function(){ 
    return App::make('\App\Http\Controllers\PageController')->callAction('view', [345]); 
}); 

मूल रूप से, मैं एक विशेष पृष्ठ आईडी के लिए एक विशिष्ट मार्ग बाध्य करने के लिए जब पेज बनाई गई है चाहते हैं (या जब स्लग या माता-पिता के लिए बदल रहे हैं)।

क्या मैं सिर्फ चीजों को खत्म कर रहा हूं?

कोई मदद या इस बारे में दिशा बहुत सराहना की जाएगी।

धन्यवाद!

+0

'क्या मैं सिर्फ चीजों को खत्म कर रहा हूं?', आईएमओ 'हां'। साथ ही, ये मार्ग स्थैतिक दिखते हैं, यदि आप किसी भी प्लेसहोल्डर को आईडी के लिए अनुमति नहीं देते हैं तो कोई गतिशीलता नहीं है। प्रत्येक मार्ग सिर्फ एक विशिष्ट 'आईडी' से जुड़ा हुआ है। –

+0

मैं चीजों को सेट अप करने की योजना के साथ, मुझे नहीं लगता कि गतिशील मार्ग का उपयोग करने का कोई तरीका है जिसके लिए मुझे सही पृष्ठ खोजने के लिए अतिरिक्त डेटाबेस क्वेरी करने की आवश्यकता नहीं होगी। मैं ब्लॉग की तरह अन्य मॉड्यूल के लिए गतिशील मार्गों का उपयोग करूंगा, लेकिन नियमित पृष्ठों के लिए, मुझे नहीं लगता कि यह काम करेगा। – Becky

उत्तर

18

जिस तरीके से मैं इसे संभालता हूं वह दो मार्गों का उपयोग करना है, एक होम पेज के लिए (जिसमें आम तौर पर समाचार जैसे जटिल जटिल तर्क, लेख चुनें, बैनर आदि), और किसी अन्य पृष्ठ के लिए सभी को पकड़ें।

मार्गों

// Home page 
Route::get('/', [ 
    'as'  => 'home', 
    'uses' => '[email protected]' 
]); 

// Catch all page controller (place at the very bottom) 
Route::get('{slug}', [ 
    'uses' => '[email protected]' 
])->where('slug', '([A-Za-z0-9\-\/]+)'); 

महत्वपूर्ण हिस्सा ऊपर में नोट करने के लिए ->where() विधि मार्ग के अंत पर श्रृंखलित है। यह आपको मार्ग पैरामीटर के लिए रेगेक्स पैटर्न मिलान घोषित करने की अनुमति देता है।इस मामले में मैं {slug} पैरामीटर के लिए अल्फान्यूमेरिक वर्ण, हाइफ़न और आगे स्लैश की अनुमति दे रहा हूं।

यह
test-page
test-page/sub-page
another-page/sub-page

PageController तरीके की तरह मल से मेल खाएगी

public function index() 
{ 
    $page = Page::where('route', '/')->where('active', 1)->first(); 

    return view($page->template) 
     ->with('page', $page); 
} 

public function getPage($slug = null) 
{ 
    $page = Page::where('route', $slug)->where('active', 1); 

    $page = $page->firstOrFail(); 

    return view($page->template)->with('page', $page); 
} 

मैं, डेटाबेस में टेम्पलेट फ़ाइल जानकारी रखने के रूप में मैं उन में खाका बनाने के लिए अनुमति देते हैं सामग्री प्रबंधन प्रणाली।

डेटाबेस पर क्वेरी से प्रतिक्रिया तो देखने के लिए पारित हो जाता है, जहां यह आदि मेटाडाटा को उत्पादन, पेज, ब्रेडक्रंब, हो सकता है

+0

जैसा कि मैंने अपने प्रश्न में उल्लेख किया है, यदि उनके अलग-अलग माता-पिता हैं तो 2 अलग-अलग पृष्ठों में एक ही स्लग हो सकती है। तो मैं आपके द्वारा सुझाए गए कार्यों को नहीं कर सकता। और मैं सही माता-पिता को खोजने के लिए कई लुकअप नहीं करना चाहता हूं। – Becky

+0

@ बेकी डेटाबेस में स्लग कॉलम में पूर्ण स्लॉग होगा। अर्थात। 'स्थानों/fargo'। इस तरह आपको डुप्लिकेट के बारे में चिंता करने की ज़रूरत नहीं है। क्या आपके स्लग के लिए अंतिम खंड का उपयोग करने का कोई कारण है? – Jeemusu

+0

स्लग शीर्षक पर आधारित पृष्ठ है। आपने जो सुझाव दिया वह पूर्ण परमालिंक होगा, और यह वह नहीं है जिसे मैं ढूंढ रहा हूं। – Becky

-7

मैं भी यही जवाब है कि एक बनाने के बारे में लिए देख रहा था laravel मैं इस के साथ आने में डायनेमिक रूटिंग: routes.php

<?php 


/* 
|-------------------------------------------------------------------------- 
| Application Routes 
|-------------------------------------------------------------------------- 
| 
| Here is where you can register all of the routes for an application. 
| It's a breeze. Simply tell Laravel the URIs it should respond to 
| and give it the controller to call when that URI is requested. 
| 
*/ 

$str=Request::url(); 
$del="/public/"; 
$pos=strpos($str, $del); 
$important1=substr($str, $pos+strlen($del), strlen($str)-1); 
$important=ucfirst($important1); 
$asif=explode("/", $important); 
$asif1=explode("/", $important1); 
//echo $important; 
$post=$asif1[0]; 
$post1=$asif1[1]; 
if(isset($asif1[2])) 
{ 
    $post2=$asif1[2]; 
} 
if(!(isset($post2))) 
{ 
    Route::match(array('GET','POST'),$important1, $asif[0].'[email protected]'.$asif[1]); 
} 
if(isset($post2)) 
{  Route::match(array('GET','POST'),$post.'/'.$post1.'/{id}',$asif[0].'[email protected]'.$asif[1]); 
} 
Route::get('/', function() { 
    return view('welcome'); 
}); 

पूर्व

में आप laravel में विधि नमस्ते साथ PostController है। आप इस यूआरएल http://localhost/shortproject/public/post/hello का उपयोग कर सकते हैं। जहां आपका प्रोजेक्ट फ़ोल्डर नाम शॉर्टप्रोजेक्ट है।

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