laravel如何处理相同的路径

时间:2017-08-20 23:12:26

标签: php laravel routing url-routing

我正在为我自己开发的框架构建自定义路由系统。我的问题是laravel如何在其路由系统中处理相同的路由。例如

Route::get('api/users/{user}', function (App\User $user) {
    return $user->email;
});

Route::get('api/user/{pass}', function (App\User $user) {
    return $user->email;
});

路线api/user/{pass}中的参数数量& api/users/{user}是一样的。他们是怎么做到的?他们如何区分路线?匹配过程如何运作?。

2 个答案:

答案 0 :(得分:2)

Laravel查找具有相同端点的路由,这意味着给定两个具有相同端点的路由,它将始终调用找到的第一个路径并停在那里,因此第二个路径永远不会到达,例如:

// Your url is user/johndoe

// It will start looking for a match

Route::get('user/{name}', function ($name) { // This route is a match 
    // This callback is called and Laravel stops searching
    return $name;
});

Route::get('user/{id}', function ($id) { // This route is also a match
    // But a callback is already been called so this one is never reached
    return $id;
});

如果您想要区分这两种路线,可以使用正则表达式来实现:

Route::get('user/{name}', function ($name) {
    // This callback will only be executed when a word is passed in
})->where('name', '[A-Za-z]+');

Route::get('user/{id}', function ($id) {
    // This callback will only be executed when a number is passed in
})->where('id', '[0-9]+');

如您所见,这两个路由都具有相同的端点,但现在它们将根据您提供的正则表达式过滤给定的参数。 希望这会对你有所帮助。

答案 1 :(得分:0)

Laravel将只采用两者的第一条路线,因为它们基本相同。它无法区分这两条路线。如果其中一种路线方法不同(即放置或发布而不是获取),则两条路线都可以工作。 -