【问题标题】:Laravel: Some routes doesn't work if it come after another route in the `routes.php` fileLaravel:如果在“routes.php”文件中的另一条路线之后,某些路线将不起作用
【发布时间】:2016-07-03 03:58:31
【问题描述】:

我正在使用 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]+");

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

【问题讨论】:

    标签: php laravel laravel-5.2 laravel-routing


    【解决方案1】:

    路由系统在找到匹配项后立即停止。所以假设你有这三个:

    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

    【讨论】:

      猜你喜欢
      • 2015-11-26
      • 1970-01-01
      • 2016-05-27
      • 2020-10-01
      • 1970-01-01
      • 2014-09-05
      • 2016-10-14
      • 2014-11-21
      • 2017-10-02
      相关资源
      最近更新 更多