我正在为我自己开发的框架构建自定义路由系统。我的问题是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}
是一样的。他们是怎么做到的?他们如何区分路线?匹配过程如何运作?。
答案 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将只采用两者的第一条路线,因为它们基本相同。它无法区分这两条路线。如果其中一种路线方法不同(即放置或发布而不是获取),则两条路线都可以工作。 -