Laravel中的断路取决于文件中定义的位置

时间:2019-01-08 15:18:26

标签: laravel

我在routes/web.php中定义了那些路由:

Route::get('references/', 'referenceController@index')
Route::get('references/{reference}', 'referenceController@show')
Route::get('references/create', 'referenceController@create')

例如,references/create路径进入404页。

如果我将此路线放在前一行,则一切正常:

Route::get('references/', 'referenceController@index')
Route::get('references/create', 'referenceController@create')
Route::get('references/{reference}', 'referenceController@show')

那显然是因为我路线中的{reference}部分,对吧?但是,由于我想完美地过滤引用,因此在RouteServiceProvider.php中放置了一个模式。此模式应检查我的引用是否为格式正确的UUID:

Route::pattern('reference', '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{10}');

与单词“ create”(与模式不匹配)相距千里。

您知道为什么我的路线会根据文件中的位置转到404页吗?

1 个答案:

答案 0 :(得分:0)

这是Laravel应该工作的方式。尽管我会承认,在documentation中并不清楚。

  

补充资源控制器

     

如果您需要添加其他   路由到默认资源集以外的资源控制器   路线,您应在致电之前定义这些路线   路线::资源;否则,由资源方法定义的路由   可能会无意中优先于您的补充路线:

     

Route::get('photos/popular', 'PhotoController@method');

     

Route::resource('photos', 'PhotoController');

如果您按照示例中的说明定义非资源路由,则也是如此。这是因为它将尝试将"create"作为reference参数的ID传递给路由,该路由当然是无效的。


经验法则

在定义具有相同数量的url段的路由时,请始终先定义没有参数变量的路由。路由文件将自上而下查找与当前请求匹配的第一条路由。