例如:
我知道如何匹配www.domain.com/foo/21
sub foo : Path('/foo') Args(1) {
my ( $self, $c, $foo_id ) = @_;
# do stuff with foo
}
但是我怎样才能匹配www.domain.com/foo/21或www.domain.com/foo/21/bar/56?
sub foo : <?> {
my ( $self, $c, $foo_id, $bar_id ) = @_;
# do stuff with foo, and maybe do some things with bar if present
}
谢谢
更新: 按照 Daxim 的建议,我尝试使用 :Regex
sub foo : Regex('foo/(.+?)(?:/bar/(.+))?') {
my ( $self, $c ) = @_;
my ( $foo_id, $bar_id ) = @{ $c->req->captures };
}
但这似乎不起作用;url 匹配,但 $bar_id 始终是 undef。如果我从正则表达式的末尾删除可选的运算符,那么它确实会正确捕获 $bar_id,但是 foo 和 bar 必须同时存在才能获得 url 匹配。我不确定这是 perl 正则表达式问题还是 Catalyst 问题。有任何想法吗?
更新:
正如 Daxim 指出的,这是一个正则表达式问题。我不明白为什么上面的正则表达式不起作用,但我确实设法找到了一个:
sub foo : Regex('foo/([^/]+)(?:/bar/([^/]+))?') {
my ( $self, $c ) = @_;
my ( $foo_id, $bar_id ) = @{ $c->req->captures };
}
(我没有像 Daxim 那样在捕获中使用 \d+,因为我的 id 可能不是数字)
感谢大家的帮助和建议,我学到了很多关于在 Catalyst 中处理 url 的知识:D