Routing 如何在Mojolicious::Lite中使用可选占位符声明路由路径?

Routing 如何在Mojolicious::Lite中使用可选占位符声明路由路径?,routing,routes,perl,mojolicious-lite,Routing,Routes,Perl,Mojolicious Lite,我需要声明一个可以处理两种请求的路由: GET /api/vote/:value GET /api/vote/:value/:date 在这两种情况下,我处理数据的方式并没有太大的不同,因此我希望在相同的位置定义它们 我现在所做的是使用了: 使用Mojolicious::Lite-signature; 使用日期时间; 获取“/vote/*值”=>sub($c){ my$datetime=datetime->now; #然后对路由参数进行处理 my@params=split(“/”,$c->p

我需要声明一个可以处理两种请求的路由:

GET /api/vote/:value 
GET /api/vote/:value/:date
在这两种情况下,我处理数据的方式并没有太大的不同,因此我希望在相同的位置定义它们

我现在所做的是使用了:

使用Mojolicious::Lite-signature;
使用日期时间;
获取“/vote/*值”=>sub($c){
my$datetime=datetime->now;
#然后对路由参数进行处理
my@params=split(“/”,$c->param('values'),2);
#如果路线中未提供日期,则为可选
if(定义为$params[1]){
my@dates_params=split('-',$params[1],3);
我的%datetime=(
年份=>$dates_参数[0],
月份=>$dates_参数[1],
day=>$dates_参数[2],
);
$datetime=datetime->new(%datetime);
}
我的%选票=(
value=>$params[0],
datetime=>$datetime,
);
#…这里有更多代码
$c->render(json=>$data);
}
这样做很好,但我对这个解决方案不太满意,因为它不是很明确,也不可读,而且我知道其他框架允许以更令人满意的方式做类似的事情

例如,以下内容,使用,只允许在一次路线声明中达到
/vote/123
/vote/123/2019-01-13

router.get('/vote/:value/:date*?',函数(req,res,next){
//在这里处理。。。
res.json(//等);
});
注意:此示例来自

在尝试了使用
Mojolicious::Lite
的各种可能性之后,我发现Mojolicious路由中的正则表达式不是一件事,我找到的最佳解决方案是通配符占位符。我错过什么了吗

% mojo generate lite_app optional
...
% $EDITOR optional
可以通过将默认值
unde
将日期标记为可选日期:

#!/usr/bin/env perl
use Mojolicious::Lite -signatures;

get '/vote/:value/*when' => { when => undef } => sub ($c) {
    my $value = $c->stash('value');
    my $when  = $c->stash('when');
    $c->render(
        format => 'txt',
        text   => $value . ' ' . ( defined $when ? $when : 'nope' ) . "\n"
    );
};

app->start;
然后,它允许有或没有日期查询:

% ./optional get /vote/42 2>/dev/null
42 nope
% ./optional get /vote/42/2020/01/07 2>/dev/null
42 2020/01/07
%