Laravel路线混乱

时间:2014-04-04 16:48:33

标签: php url laravel slug laravel-routing

如何在Laravel Framework中的routes.php中处理2个类似的URL?

例如:

  • mysite / shoes(类别页面)
  • mysite / adidas-model-1(产品页面)

代码:

#Categories Pages
Route::get('{catSlug}', array('uses' => 'CategoriesController@show'));

#Product Page
Route::get('{productSlug}', array('uses' => 'ProductController@show'));

如果我浏览到类别控制器中的mysite / shoes show方法被触发,但如果我浏览到mysite / adidas-model-1,它不是ProductController的show方法,而是被触发的CategoriesController之一。

在routes.php文件中有没有很好的方法来实现这个目的?或者我将所有路由到CategoriesController @ show,如果找不到对象,则触发ProductController的show方法?

感谢。

3 个答案:

答案 0 :(得分:1)

在您显示的两条路线中,路由器无法知道您何时输入catSlug以及何时输入productSlug - 他们& #39;两个字符串,没有代码可以区分它们。

您可以通过添加where子句来解决此问题:

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

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

在上面的正则表达式中,我假设类别只是大写和小写字母的字符串 - 没有数字,没有空格,没有标点符号 - 产品包含连字符和数字。

我还要补充一点,这些声明的顺序很重要。产品路线也与类别路线匹配,因此应首先声明类别路线,因此它有机会开火。否则,一切看起来都像是产品。

答案 1 :(得分:0)

感谢您的回答。

我真的需要摆脱我为slu my所选择的东西。所以我找到了另一个解决方案。

# Objects (cats or products)
Route::get('{slug}', array('uses' => 'BaseController@route'));

并在我的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'));
    }
}

我首先测试一个Category对象(我的类别少于产品),如果没有找到,我会测试一个产品。

答案 2 :(得分: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;
});