带有可选子路径的Laravel路由


Laravel routes with an optional sub-path

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

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

url可以是以下内容:

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

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

我现在用了一个技巧来避免这种情况,用~代替/作为子路径,然后替换它们,但我想知道是否有更好的方法可以让我只在URL中使用/

更新

找到了解决方案,感谢Mark:

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

对于要为其定义路由的url,必须有范围。我想子路由的数量是/必须预定义的,比如说你想使用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子部分。

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