Laravel:如果某些路由来自`routes.php`文件中的另一条路径,则它们不起作用

时间:2016-07-02 19:53:27

标签: php laravel laravel-5.2 laravel-routing

我正在使用Laravel 5.2构建项目,而在 $scope.btnPost_clicked = function(newNoteText) { $scope.addNote(newNoteText); $scope.newNoteText = ''; } 文件中,我有接下来的两条路线:

routes.php

按此顺序,第一条路线Route::get("/products/{id}", [ "as" => "products.show", "uses" => "ProductsController@show", ]); Route::get("/products/search", [ "as" => "products.search", "uses" => "ProductsController@search", ]); 正常工作,正如预期的那样,但第二条路线products.show没有,它会提供一个空白网页,而不是预期的搜索结果。

我尝试通过更改订单并在products.search路线前放置products.search路线来解决问题,当我这样做时,它工作正常并且符合预期。

那么,出了什么问题?为什么会这样呢?

P.S:另一种解决方案是将下一条规则放在products.show文件的开头:

route.php

当我添加这条规则时,两条路线都可以找到,而且哪条路线首先出现并不重要。但是,如果我没有添加此规则呢?

1 个答案:

答案 0 :(得分:4)

路由系统一找到匹配就会停止。所以,让我们说你有这三个:

Route::get("/products/{variableA}" // ...
Route::get("/products/{variableB}" // ...
Route::get("/products/{variableC}" // ...

现在你去/products/someroute。只有第一个会触发,而后面的两个将永远不会激活。

您的模式约束意味着当您转到/products/search时,第一个不会触发,因为它正在寻找数字{id}变量。

没有该约束,{id}可以是任何东西 - 例如字符串search。那么,那么第二条路线就不会触发。因此,您需要将它们按相反顺序放置才能正常工作。

您还可以使用路线模型绑定,您可以在此处阅读:https://laravel.com/docs/5.2/routing#route-model-binding