带有可选子路径的 Laravel 路由

Posted

技术标签:

【中文标题】带有可选子路径的 Laravel 路由【英文标题】:Laravel routes with an optional sub-path 【发布时间】:2016-04-10 15:21:14 【问题描述】:

我正在尝试在routes.php 中创建一个可以处理可选无限子路径的路由。

Route::get('/path/url', function($url)
  echo $url;
);

网址可以是以下:

/path/part1
/path/part1/part2
/path/part1/part2/part3
etc.

但是由于 url 中的 / 与子路径不匹配,所以什么也没有发生。 (当然,echo $url 仅用于测试)。

我现在使用一个技巧来避免这种情况,通过使用 ~ 而不是 / 作为子路径,然后替换它们,但我想知道是否有更好的方法,所以我可以使用 @987654329网址中的@。

更新

找到解决方案,感谢 Mark:

Route::get('/path/all', function($url)
  echo $url;
)->where('all', '.*');

【问题讨论】:

***.com/questions/13297278/… 可能会回答您的问题。 (:any) 似乎不再在 Laravel 5 中工作了? any 和 all 确实有效,但似乎与子路径不匹配...... anyall 没有什么特别之处,因为它们只是普通的路由参数。 【参考方案1】:

url 必须有一个extent,您想为其定义路由。我想子路由的数量是/必须预定义的,比如说你想使用4 url 部分。

如果是这样,那么使用 可选参数 将是最好的选择:

Route::get('path/url1?/url2?/url3?/url4?', 
     function($url1 = null, $url2 = null, $url3 = null, $url4 = null)

     //check if sub-routes are defined and combine them to produce the desired url
);

注意:

(:any) 似乎不再支持 @Mark Davidson 在 SO 答案中所建议的参数(我无法在 laravel 5.0 中重现它)。

同时,您还可以使用正则表达式来达到预期的效果,如下所示(可能与您自己的方法非常相似):

Route::get('/url', function ($url) 

// other url parts can be extracted from $url

)->where('url', '.*');

但是使用第二种方法的唯一缺点是您可能不知道应该嵌套到什么程度来提取 url 子部分。

不过,使用前一种方法,您知道范围

【讨论】:

以上是关于带有可选子路径的 Laravel 路由的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 路由相同的基本路径

带有可选参数和 ajax 调用的 Laravel 路由

Json - 可选子文档

argparse 可选子解析器(用于 --version)

带有可选路径参数的简单 React 路由器给出“TypeError:无法读取未定义的属性“过滤器”

从可选子查询中插入多个返回值