【问题标题】:Laravel 5.2 Routing with optional paramsLaravel 5.2 带有可选参数的路由
【发布时间】:2018-04-06 00:31:42
【问题描述】:

我正在 Laravel 5.2 中创建一个简单的产品搜索引擎。我可以使用 get 或 post 来完成我想要的,即使我需要做一些后端处理然后将漂亮的 URL 传递给另一个方法来显示产品。

我的参数是 - 询问 - 商人 - 品牌 - 页 - 排序

所有这些参数都可以单独使用或单独使用。 如果可能的话,我想使用漂亮的 URL。

基本上我希望 URL 看起来像这样:

/shop/query/shoes
/shop/query/shoes/brand/nike
/shop/query/sort/price
/shop/merchant/amazon

这5个参数可以形成很多不同的路由,但都是可选的。那么,让这条路线按我想要的方式工作的最佳解决方案是什么,而不需要为每条可能的路线编码。

我确定我忽略了一些东西。我之前使用过 Zend Framework,只是在 shop 之后使用 *,然后我可以传递任何东西。

如果您需要任何其他信息,请告诉我。感谢您的帮助。

【问题讨论】:

标签: php laravel laravel-5.2


【解决方案1】:

试试这样的

Route::get('shop/{params?}', function(Request $request, $params = '') {
    // everything after "shop/" will be in $params

    // you need to add custom logic to parse and handle $params string

    return $params;

})->where('params', '(([a-zA-Z0-9-_]+)\/?)+');

{params?}Optional Parameter

有时您可能需要指定一个路由参数,但该路由参数的存在是可选的。您可以通过放置一个 ?在参数名称后标记。确保给路由对应的变量一个默认值

->where('params', ...)Regular Expression Constraint

您可以使用路由实例上的 where 方法来限制路由参数的格式。 where 方法接受参数的名称和定义如何约束参数的正则表达式


注意

确保调整 ((([a-zA-Z0-9-_]+)/?)+ 正则表达式以涵盖所有情况,因为这是我添加的快速测试您的示例

【讨论】:

  • 这涵盖了这种情况即使我需要做一些后端处理 :)
  • 完美,我可以从那里拿走它,也非常接近,我在商店后投入了 {params?} 但从未将它与正则表达式配对。谢谢!
  • @BFreitag04 Laravel 文档很大,很容易漏掉一些东西。祝你好运!此外,如果您决定添加(覆盖)将覆盖例如 /shop/query/shoes 的路线,请确保您在我的示例中 在路线之前添加它。后面加的话就不行了
猜你喜欢
  • 2017-04-04
  • 2016-04-06
  • 1970-01-01
  • 2016-10-12
  • 2023-03-03
  • 2015-02-07
  • 1970-01-01
  • 2015-11-17
相关资源
最近更新 更多