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
我正在用 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