2016-03-24 96 views
1

我會網址,將類似於以下Laravel 4.2和URL

 whatever.com/products/accessories/1 
     whatever.com/products/amplifiers/2 
     whatever.com/products/speakers/3 

我已閱讀併到處搜尋,但想不通我怎麼能與一個路線::

如果處理這個問題我請執行下列操作

 whatever.com/products/1 
     whatever.com/products/2 
     whatever.com/products/3 

我可以使用下面的路線::

Route::model('product', 'Product'); 

    Route::get('products/{product}', function(Product $product) 
    { 
     return View::make('product', array('product' => $product->toArray())); 
    }); 

但這DOS不做出非常友好的URL

在此先感謝

回答

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不會。

+0

這正是我所尋找的。非常感謝你。 – zr1vette

0

搜索後幾個小時,我發現了以下解決方案

路線::獲得(「產品/ {P?}/{P2 ?}/{p3?}/{p4?}','ProductController @ index');

+0

雖然你可以使用這樣的可選參數,但它仍然沒有解決這個事實,即你的中間「產品類別」參數是毫無意義的,因爲你可以輸入任何內容並且它仍然會匹配。請檢查我的解決方案,這將允許兩個參數仍然執行並具有意義。 –