路线优先顺序

时间:2016-12-06 14:04:21

标签: php laravel blade laravel-5.3

我有两条路由,其方法写在同一个控制器[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是否具有路由优先权?

2 个答案:

答案 0 :(得分:0)

发生这种情况是因为,Laravel匹配文件中的路由,并且先前出现的路由与模式匹配将首先执行,您可以使用正则表达式模式技术来避免这样:

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

请参阅Laravel Routing Docs

希望这有帮助!

答案 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