【问题标题】:Laravel deep routing with multiple optional values具有多个可选值的 Laravel 深度路由
【发布时间】:2018-12-12 23:11:26
【问题描述】:

我正在寻找解决此问题的最佳方法。

我有一个发布简单搜索的表单,但是有多个可选值。然后控制器将帖子重定向到更易于阅读的 URL。

例如

startdate=2018-01-01
enddate=2018-01-31
department=2,4

这将创建一个 URL

/2018-01-01/2018-01-31/2,4/

但如果他们也按员工搜索,则会返回以下内容

employee=9,5,1
/2018-01-01/2018-01-31/2,4/9,5,1/

他们也不能搜索部门而只搜索员工

/2018-01-01/2018-01-31/???/9,5,1/

因此,考虑到下面显示的完整 URL 路由计划,您将如何使用嵌套的可选属性?另外,之后您将如何在路由中获取这些值?

Route::get('/{locale}/WIPReport/show/{startdate}/{enddate}/{regions?}/{offices?}/{departments?}/{clients?}/{employees?}', 'WIPReportController@reportdata')
    ->where(['regions' => '[0-9,]+', 'offices' => '[0-9,]+', 'departments' => '[0-9,]+', 'clients' => '[0-9,]+', 'employees' => '[0-9,]+'])

【问题讨论】:

  • 这些作为查询字符串不是更好吗?
  • 可以使用多个可选的路由参数,但除非你将/null/0等放入你的URL并进行相应的处理,否则你会遇到问题。考虑使用查询字符串,通过POST等处理
  • @TimLewis 我也这么想。我曾考虑将帖子数据保留为帖子,但还有另一个功能可以让他们为报告添加书签以进行重新创建,这样就行不通了。将其发布为答案,我会接受

标签: php laravel routes laravel-5.6


【解决方案1】:

可以使用多个可选的路由参数,但除非你输入/null/none/0 等,否则你肯定会遇到问题。以这个 URL 和 Route 为例:

Route::get("{primary?}/{secondary?}/{tertiary?}", ExampleController@handleColours);

public function handleColours($primary = null, $secondary = null, $tertiary = null){
  // Handle URL
}

"mysite.com/red/blue/green"

在上面,一切正常,因为所有 3 个都已定义。删除green 也可以,因为$tertiary 将默认为null。接下来,给定这条路线:

"mysite.com/red/green"

如果您打算将green 用作第三级,并期望基于此的结果,您会遇到$secondary 未在URL 中定义的问题,因此$secondary 将是green 而不是null。如果您将 URL 更改为

"mysite.com/red/null/green"
// OR
"mysite.com/red/none/green"
// OR
"mysite.com/red/0/green"

然后事情会按预期运行(假设需要一些额外的逻辑来将字符串 "null""none" 转换为 null),但 URL 可能会有点混乱。其他选项是使用查询字符串来明确指定参数:

"mysite.com?primary=red&tertiary=green"

所以有多种方式可以处理;选择最适合你的。

【讨论】:

  • 我接受了这个答案,它没有完全回答问题,但它确实指出了实现设计的失败以及使用 0 或 null 解决它的方法
猜你喜欢
  • 2014-05-04
  • 2018-08-24
  • 2016-11-05
  • 1970-01-01
  • 2019-03-07
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多