命名参数通常作为路由段而不使用明确的名称。例如,你可以这样做:
Route:get('test/{id?}/{page?}/{opt?}', function ($id = null, $page = null, $opt = null) {
});
$id
,$page
和$opt
都是可选的,因为在段定义中使用了?
符号,而且它们在函数中有默认值。然而,你会发现这里存在一个问题:
- 它们必须按正确的顺序出现在URL中
- 只有
$opt
是真正可选的,如果提供了$opt
,则必须提供$page
,如果提供了$page
,则必须提供$id
这是由于Laravel将命名段映射到函数/方法参数的方式所带来的限制。理论上,您可以实现自己的逻辑使其工作,但是:
Route:get('test/{first?}/{second?}/{third?}', function ($first = null, $second = null, $third = null) {
if ($first) {
list($name, $value) = @explode('=', $first, 2);
$$name = $value;
}
if ($second) {
list($name, $value) = @explode('=', $second, 2);
$$name = $value;
}
if ($third) {
list($name, $value) = @explode('=', $third, 2);
$$name = $value;
}
});
这并不是一个非常简单的解决方案,它依赖于=
的盲目爆炸以及设置任意输入变量的名称(这显然会引起麻烦)。您应该向此代码添加更多检查,但它应该可以给您提供如何解决上述两个问题的想法。
应该注意,这有点违背了在Laravel中进行路由和URI的“正确方法”,因此除非您真正需要此功能,否则应重新考虑形成这些URI的方式,以使用Laravel框架更好地设置。