我的网址将如下所示
whatever.com/products/accessories/1
whatever.com/products/amplifiers/2
whatever.com/products/speakers/3
我到处读过并搜索过,但无法弄清楚如何用一个Route ::
来处理这个问题如果我执行以下操作
whatever.com/products/1
whatever.com/products/2
whatever.com/products/3
我可以使用以下Route ::
Route::model('product', 'Product');
Route::get('products/{product}', function(Product $product)
{
return View::make('product', array('product' => $product->toArray()));
});
但这不是非常友好的网址
提前致谢
答案 0 :(得分:0)
经过几个小时的搜索,我找到了以下解决方案
路由:: get('产品/ {p1?} / {p2?} / {p3?} / {p4?}',' ProductController @ index');
答案 1 :(得分:0)
为了强制执行中间参数并使其有意义,同时仍然建立了最终传递的ID,您可以将Route Model Binding与解析器函数一起使用。传递给解析程序函数的第二个参数是Illuminate\Routing\Route
的实例,如果您检查其API,您会看到它有一个parameter()
方法,可以让您获得路径中的任何参数。这允许您访问这两个参数并从中构建查询。
Route::bind('product', function($value, $route){
$category = $route->parameter('category');
$product = Product::where(['id' => $value, 'category' => $category])->first();
return $product ?: 'Not found';
});
Route::get('products/{category}/{product}', function($category, $product)
{
return View::make('product', array('product' => $product->toArray()));
});
请注意,如果没有结果,我将返回一个显示'Not found'
的字符串,但您可以返回任何内容。这允许您强制执行中间参数实际上具有意义,以便whatever.com/products/amplifiers/2
将返回实际结果,而whatever.com/products/fake/2
则不会。