【问题标题】:How laravel handles same get routeslaravel 如何处理相同的获取路线
【发布时间】:2017-08-20 23:12:25
【问题描述】:

我正在为我自己开发的框架构建一个自定义路由系统。我的问题是 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} 路由中的参数个数相同。他们是怎么做到的?他们如何区分路线?匹配过程如何进行?

【问题讨论】:

  • 两条路线不同。一个说用户,另一个说用户..它将使用您从两者中取出的任何一个。对不起,如果我错过了重点。

标签: php laravel routing url-routing


【解决方案1】:

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]+');

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

【讨论】:

    【解决方案2】:

    Laravel 只会走两者中的第一条路线,因为它们基本相同。它没有办法区分这两条路线。如果其中一个路由方法不同(即 put 或 post 而不是 get),那么这两个路由都可以工作。 ——

    【讨论】:

    • 但问题是如果它不能区分路由,它将执行 2 个回调 tho ..
    • 嗯,我认为您应该对两者使用相同的路线,因为它基本相同。您还可以执行以下操作:Route::get('api/user/{user}/{pass}', function (App\User $user, App\User $pass) { return $user->email; }) ;
    • 但他们如何区分它?他们使用正则表达式还是其他任何东西?
    • 它不区分,它选择两者之间的第一个,仅此而已。一旦它匹配了一条路线,它就完成了。
    • 我不这么认为,伙计。如果它像你说的那样进行路由,它将实例化一个错误的回调..想想..
    猜你喜欢
    • 2015-07-17
    • 2020-02-20
    • 1970-01-01
    • 2016-08-03
    • 2020-12-03
    • 2016-05-09
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多