2016-12-06 200 views
1

我有2種途徑與他們的方法寫在同一個控制器[LinkController]:路由優先級順序

Route::get('/{country}/{category}', ['as' => 'tour.list', 'uses' => '[email protected]']); 

Route::get('/{category}/{slug}',['as' => 'single.tour', 'uses' => '[email protected]']); 

而且我的方法是:

public function tourlist($country, $category) 
{ 
    $tour = Tour::whereHas('category', function($q) use($category) { 
      $q->where('name','=', $category); 
     }) 
     ->whereHas('country', function($r) use($country) { 
      $r->where('name','=', $country); 
     }) 
     ->get(); 
    return view('public.tours.list')->withTours($tour); 
} 
public function singleTour($slug,$category) 
{ 
    $tour = Tour::where('slug','=', $slug) 
       ->whereHas('category', function($r) use($category) { 
      $r->where('name','=', $category); 
     }) 
     ->first(); 
    return view('public.tours.show')->withTour($tour); 
} 

我的視圖代碼是:

<a href="{{ route('single.tour',['category' => $tour->category->name, 'slug' => $tour->slug]) }}">{{$tour->title}}</a> 

我遇到的麻煩是第二條路線[single.tour]返回第一條路線[tour.list]的視圖。我試圖在第二種方法中返回其他視圖,但仍返回第一種方法的視圖。 laravel有路由優先權嗎?

+0

燁,後者將優先考慮http://stackoverflow.com/questions/20870899/order-of-route-declarations-in-laravel-package – SteD

回答

0

這是因爲發生的事情,Laravel比賽路線從文件,並較早來得快,匹配模式將首先執行,你可以使用正則表達式的技術來避免這一類的路線:

Route::get('user/{name}', function ($name) { 
    // 
})->where('name', '[A-Za-z]+'); // <------ define your regex here to differ the routes 

Laravel Routing Docs

希望這會有所幫助!

+0

是很好的建議,使用' - >哪裏()'更明確...... – Kyslik

0

您的路線都包含兩個參數在同一個地方。這意味着任何匹配路由1的URL都將匹配路由2.無論按照什麼順序將它們放入路由定義中,所有請求都將始終轉到相同的路由。

爲了避免這種情況,您可以使用正則表達式對參數指定限制。例如,country參數可能只接受兩個字母的國家/地區代碼,或者category參數可能必須是數字ID。

Route::get('/{country}/{category}') 
    ->where('country', '[A-Z]{2}') 
    ->where('category', '[0-9]+'); 

https://laravel.com/docs/5.3/routing#parameters-regular-expression-constraints

+0

根據你的建議,我修改了我的路線:'Route :: get('/ {country}/{category}',''as'=>' tour.list','uses'=>'LinkController @ tourlist']) \t \t \t \t - > where('country','[A-Za-z] +') - > where('category',' [A-Za-z] +');'和'Route :: get('/ {category}/{slug}',['as'=>'single.tour' , '使用'=> 'LinkController @ singleTour']) \t \t \t \t - >其中( '類別', '[A-ZA-Z] +') - >其中( '類別',「[W \ d \');'';'我得到這個錯誤'Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException' –

+0

你試過什麼網址? – LorenzSchaef

+0

現在解決了這個問題。 –