【问题标题】:Laravel 5.5 resource controller misbehavingLaravel 5.5 资源控制器行为不端
【发布时间】:2017-12-27 08:54:16
【问题描述】:

我使用 --resource 命令创建了我的 UserController。

现在,我有两条路线。

Route::get('user/{id}', 'UserController@show');

Route::get('user/certificate', 'UserController@showUserCertificate');

由于我没有使用 Route::resource 方法,官方文档说调用第二个路由不应该触发第一个。但在我的情况下并没有发生这种情况。

OD 还说,在订单的情况下,任何路由而不是资源都应该在这些之前声明。我也试过了。我仍然需要 show 方法而不是 showUserCertificate 方法。我在这里想念什么?

【问题讨论】:

  • 你使用的是哪个版本的 Laravel?
  • 5.5,php 版本 7.1.8
  • 5.5 的版本。到底是什么版本
  • 对不起。它的 5.5.7
  • 你需要升级,查看我更新的答案

标签: php laravel routes laravel-5.5


【解决方案1】:

当然,它总是命中show 路线。它是与您请求的 URI 匹配的第一个路由...您在该路由中定义了一个路由参数,因此它匹配以 user 开头并具有 1 个附加段的任何内容。

user/blah
user/anything
user/certificate

所有这些都匹配user/{id}。第一个匹配的路线是使用的路线。颠倒这两条路线的顺序,让更具体的路线排在第一位。

更新: 您需要升级框架。在该版本中引入了一个与路由排序相关的错误。 5.5.8 修复了它。 Reference to GitHub PR to revert change

【讨论】:

  • 对不起,我可能未能在第二段中解释。我在声明用户/证书后尝试声明用户/{id}。尽管如此,它并没有解决问题。
  • 好吧,我无法猜测您在应用程序中定义的所有路由......这就是路由的工作方式,第一个匹配的路由被使用,它永远不会改变......你不应该缓存您的路线,但清除路线缓存以防万一
  • 尝试清除路由缓存,没有帮助。 'user/{id}' 是导致问题的唯一途径。没有其他途径可以导致这种情况。
【解决方案2】:

是的,在这种情况下,每次调用第二条路由时都会调用第一条路由。 第二条路由中的证书将被视为第一个控制器中的 {id}。如果正确,请投票给我的答案

Route::get('user/{id}', 'UserController@show');

Route::get('user/certificate', 'UserController@showUserCertificate');

//你可以改成 Route::get('user/certificate/{id}', 'UserController@showUserCertificate');

【讨论】:

  • 对不起,我可能未能在第二段中解释。我在声明用户/证书后尝试声明用户/{id}。尽管如此,它并没有解决问题。
猜你喜欢
  • 2018-05-21
  • 2018-05-17
  • 2018-12-18
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 1970-01-01
相关资源
最近更新 更多