Laravel路由带有可选的子路径

时间:2016-01-06 13:50:21

标签: php laravel laravel-routing

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

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

网址可以是以下内容:

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

但由于网址中/的子路径不匹配,所以没有任何反应。 (echo $url当然只是用于测试。)

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

更新

找到解决方案,感谢Mark:

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

1 个答案:

答案 0 :(得分:1)

您要为其定义路线的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子部分。

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