2014-04-04 110 views
1

如何處理Laravel Framework中的routes.php中的2個類似url?Laravel路由與slu conf混淆

如:

  • 的mysite /鞋(類別頁面)
  • 的mysite /阿迪達斯模型-1(產品頁)

代碼:

#Categories Pages 
Route::get('{catSlug}', array('uses' => '[email protected]')); 

#Product Page 
Route::get('{productSlug}', array('uses' => '[email protected]')); 

如果我在CategoriesController中瀏覽到mysite/shoes show方法被解僱,但是如果我瀏覽到mysite/adidas-model-1,它不是Pr的顯示方法oductController,但它是被激發的CategoriesController之一。

有沒有一種很好的方式來實現這個在routes.php文件?或者,我將所有路由到CategoriesController @ show,如果找不到對象,則觸發ProductController的show方法?

謝謝。

回答

1

在你顯示的兩條路由中,路由器無法知道你何時輸入catSlug,以及輸入的是productSlug - 它們都是字符串,並且沒有代碼可以區分它們。

您可以通過添加一個where條款糾正這一點,

Route::get('{catSlug}', array('uses' => '[email protected]')) 
    ->where('catSlug', '[A-Za-z]+'); 

Route::get('{productSlug}', array('uses' => '[email protected]')) 
    ->where('productSlug', '[-A-Za-z0-9]+'); 

在上述正則表達式中,我假定類別的只有大寫和小寫字母串 - 沒有數字,沒有空格,沒有標點 - 產品包括連字符和數字。

我還應該補充說明這些聲明的順序很重要。產品路線也與類別路線相匹配,因此應該首先聲明類別路線,以便有機會開火。否則,一切都看起來像一個產品。

+0

你可以改變產品的正則表達式來「[-a-ZA-Z] + - \ d + $」,使其忽略類別刺蛾只要產品「 - 值」 –

0

感謝您的回答。

我真的需要沒有我爲我的slu choose選擇的東西。所以我找到了其他解決方案。

# Objects (cats or products) 
Route::get('{slug}', array('uses' => '[email protected]')); 

,在我BaseController文件:

public function route($slug) 
{ 
    // Category ? 
    if($categories = Categories::where('slug', '=', $slug)->first()){ 
     return View::make('site/categories/swho', compact('categories')); 
    // Product ? 
    }elseif($products = Products::where('slug', '=', $slug)->first()){ 
     return View::make('site/products/show', compact('products')); 
    } 
} 

我第一次測試的類對象(我有少大類產品),如果沒有找到我測試的產物。

+0

我最終只匹配產品首先希望在我的路線文件中創建一個過濾器,以使兩條路線都達到此目的,但無法找到如何停止路線並告訴Laravel「去檢查下一條路線」。 – wouf

0

試着讓它像這樣,這是我如何使用它。

Route::get('{slug}', function($slug) { 

// IF IS CATEGORY... 
    if($category = Category::where('slug', '=', $slug)->first()): 
     return View::make('category') 
     ->with('category', $category); 
// IF IS PRODUCT ... 
    elseif($product = Product::where('slug', '=', $slug)->first()): 
     return View::make('product') 
     ->with('product', $product); 
// NOTHING? THEN ERROR 
    else: 
     App::abort(404); 
    endif; 
});