Например:
Я знаю, как сопоставить 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
}
Спасибо
Обновление: Следуя совету Даксима, я попытался использовать: 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.Есть идеи?
Обновление:
Как указывает Даксим, это проблема регулярных выражений.Я не понимаю, почему вышеприведенное регулярное выражение не работает, но мне удалось найти такое, которое работает:
sub foo : Regex('foo/([^/]+)(?:/bar/([^/]+))?') {
my ( $self, $c ) = @_;
my ( $foo_id, $bar_id ) = @{ $c->req->captures };
}
(я не использовал \ d + в снимках, как Даксим, как мои идентификаторыможет не быть числовым)
Спасибо всем за помощь и предложения, я многое узнал об обработке URL в Catalyst: D