Laravel 4.2和URLS

时间:2016-03-24 01:16:21

标签: laravel-4 routes

我的网址将如下所示

      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()));
    });

但这不是非常友好的网址

提前致谢

2 个答案:

答案 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则不会。