【问题标题】:Laravel Route issues with Route order in web.phpLaravel Route 与 web.php 中的 Route 顺序有关的问题
【发布时间】:2017-12-10 01:45:06
【问题描述】:

我在 Laravel 中的路由有问题,我正在学习一个教程,我们在 web.php 文件中列出了这些路由

Route::get('/home', 'HomeController@index')->name('home');
Route::get('/blog', 'BlogController@index')->name('blog');
Route::get('/blog/create', 'BlogController@create');
Route::post('/blog/store', 'BlogController@store');
Route::get('/blog/{id}', 'BlogController@show');
Route::get('/blog/{id}/edit', 'BlogController@edit');
Route::patch('/blog/{id}', 'BlogController@update');
Route::delete('/blog/{id}', 'BlogController@destroy');
Route::get('/blog/bin', 'BlogController@bin');

问题出在通往 blog/bin 的最后一条路线上,如果我将其放在下方,它将无法正常工作,但是在教程中我们已将其移至其他路线的顶部,然后它工作正常,讲师说存在一些冲突路线,最后一条路线需要在顶部才能工作,但根本没有解释为什么?任何人都可以更详细地解释一下,因为我真的刚刚开始使用 Laravel...

【问题讨论】:

  • 你可以看到你已经用相同的get 方法定义了两条路由,签名是相同的,所以当它试图在你的情况下找到合适的路由时,它的 /bin 但是当 laravel 到达 /{ id} 它以 bin 作为参数,因为两者具有相同的签名。

标签: php laravel-5 laravel-5.4 laravel-routing


【解决方案1】:

当访问一个路由时,Laravel 会从上到下遍历你的路由列表,直到找到一个“匹配”的路由,然后立即选择该路由。

在您的示例中,当尝试使用 GET 访问 /blog/bin 时,它有两个潜在的匹配项:

Route::get('/blog/{id}', 'BlogController@show');

Route::get('/blog/bin', 'BlogController@bin');

在这种情况下,Route::get('/blog/{id}', 'BlogController@show'); 先出现,因此会被选中。

正如前面的答案正确指出的那样,将/blog/bin 路由放在/blog/{id} 路由上方可以解决问题。然而,这个“解决方案”让您在未来面临类似的错误(例如,定义/blog/example 路由并意外将其置于/blog/{id} 下)。另外,我个人认为让你的路由的功能依赖于放置它们的顺序并不是很优雅。

在我看来,如果可能,更稳健的解决方案是限制/blog/{id} 接受的可能值与regex constraint

例如,如果您在博客文章中使用数字 ID,则您知道如果 id 是数字,您只想使用路由 /blog/{id}。因此,您可以按如下方式定义您的路线:

Route::get('/blog/{id}', 'BlogController@show')->where('id', '[0-9]+');

当然这通常是不可能的,例如,如果您将帖子标题用作id,但如果有某种方法可以将帖子id 与任何其他/blog/foo 路由区分开来,那么这将有可能。

【讨论】:

  • 比你,现在清楚多了,我明白这个问题,以及将来如何避免它
  • 我不知道这是否是真的。我认为 laravel 现在可能会匹配最后一条路线。
  • @Neve12ende12 我现在不能快速测试它,但是查看这里的源代码:github.com/laravel/framework/blob/5.8/src/Illuminate/Routing/… 建议它仍然可以工作(注意它如何尝试找到与给定请求匹配的第一条路由)
  • 给路线命名也可能是一种解决办法,如果你以后想改变路线也很方便。
【解决方案2】:

您不能在路由参数上定义类型。所以 Laravel 猜测你的参数可以是整数甚至是字符串。

基于此,如果您尝试访问/blog/bin。 Laravel 将尝试使用路由 /blog/{id} 和 id 参数中的“bin”。

这里有一个比我更好的答案:https://laracasts.com/discuss/channels/laravel/order-of-routes-being-applied/replies/149199

【讨论】:

    猜你喜欢
    • 2018-05-28
    • 2014-06-23
    • 2014-12-15
    • 2014-06-23
    • 2021-12-01
    • 2017-05-12
    • 1970-01-01
    • 2013-10-06
    相关资源
    最近更新 更多