如何在Laravel Framework中的routes.php中处理2个类似的URL?
例如:
代码:
#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方法?
感谢。
答案 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;
});