我有两条路由,其方法写在同一个控制器[LinkController]:
Route::get('/{country}/{category}', ['as' => 'tour.list', 'uses' => 'LinkController@tourlist']);
Route::get('/{category}/{slug}',['as' => 'single.tour', 'uses' => 'LinkController@singleTour']);
我的方法是:
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 :(得分:0)
发生这种情况是因为,Laravel匹配文件中的路由,并且先前出现的路由与模式匹配将首先执行,您可以使用正则表达式模式技术来避免这样:
Route::get('user/{name}', function ($name) {
//
})->where('name', '[A-Za-z]+'); // <------ define your regex here to differ the routes
希望这有帮助!
答案 1 :(得分: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