例如:在Catalyst控制器中處理可選url參數的最佳方式是什麼?
我知道如何搭配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 OR 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的建議下,我試圖用:正則表達式
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 regex問題還是Catalyst問題。有任何想法嗎?
更新:
由於Daxim指出,它的正則表達式的問題。我不明白爲什麼上述正則表達式不工作,但我還是設法找到一個不:
sub foo : Regex('foo/([^/]+)(?:/bar/([^/]+))?') {
my ($self, $c) = @_;
my ($foo_id, $bar_id) = @{ $c->req->captures };
}
(我不喜歡Daxim沒有使用\ d +在捕捉我的ID可能爲數字),所有的幫助和建議
謝謝,我學到了很多在催化劑處理網址:d
感謝指針daxim,但我不能得到可選的正則表達式工作 - 我更新了與細節的問題。 – nick 2010-12-10 12:29:42
是的,它是一個正則表達式問題 - 謝謝!我已經使用工作代碼更新了我的帖子。 – nick 2010-12-10 15:31:32