例えば:
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 の提案に従って、:Regex を使用しようとしました
sub foo : Regex('foo/(.+?)(?:/bar/(.+))?') {
my ( $self, $c ) = @_;
my ( $foo_id, $bar_id ) = @{ $c->req->captures };
}
しかし、これはうまくいかないようです。URL は一致しますが、$bar_id は常に undef です。正規表現の末尾からオプションの演算子を削除すると、$bar_id が正しくキャプチャされますが、url の一致を取得するには foo と bar の両方が存在する必要があります。これが perl regex の問題なのか、Catalyst の問題なのかはわかりません。何か案は?
アップデート:
Daxim が指摘しているように、これは正規表現の問題です。上記の正規表現が機能しない理由はわかりませんが、機能するものを見つけることができました:
sub foo : Regex('foo/([^/]+)(?:/bar/([^/]+))?') {
my ( $self, $c ) = @_;
my ( $foo_id, $bar_id ) = @{ $c->req->captures };
}
(IDが数値ではない可能性があるため、Daximのようにキャプチャで\ d +を使用しませんでした)
ヘルプと提案に感謝します。Catalyst での URL の処理について多くのことを学びました:D