Laravel:如果某些路由位于“routes.php”文件中的另一条路由之后,则该路由不起作用

Laravel: Some routes doesn't work if it come after another route in the `routes.php` file

我正在用 Laravel 5.2 构建一个项目,在 routes.php 文件中我有接下来的 2 条路线:

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 路线放在 products.show 路线之前来解决这个问题,当我这样做时它工作正常并且符合预期。

那么,怎么了?为什么会这样?

P.S:另一个解决方案是将下一条规则放在 route.php 文件的开头:

Route::pattern("id", "[0-9]+");

当我添加这条规则时,两条路线都能找到,而且哪一条先到并不重要。但是,如果我不添加这条规则呢?

路由系统一找到匹配就停止。所以假设你有这三个:

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