同一 Action 名の Path Spec を実装するには Chained を使う

By admin | 2009年5月19日

/hoge/*

今まで上記のような Path Spec を実装するときは

sub hoge : Args(1) {
    my $self = shift;
    my ($c, @args) = @_;
}

こんな感じでやってた。

/hoge
/hoge/*
/hoge/*/*

で、今回はこういう Path Spec を実装したかったので
同じようにだけでできるかと思ってやったら
dispatch されなくなってできなかった。

sub hoge : Args(0) {
    my $self = shift;
    my ($c) = @_;
}
sub hoge : Args(1) {
    my $self = shift;
    my ($c, @args) = @_;

}
sub hoge : Args(2) {
        my $self = shift;
    my ($c, @args) = @_;

}

で、それを sasata299 が解決してくれた。GJ
Chained を使えばいいらしい。

sub chain : Chained('/') PathPart('') CaptureArgs(0) {
        my $self = shift;
    my ($c) = @_;

}
sub hoge1 : Chained('chain') PathPart('hoge')  Args(0) {
    my $self = shift;
    my ($c) = @_;
}
sub hoge2 : Chained('chain') PathPart('hoge')  Args(1) {
    my $self = shift;
    my ($c, @args) = @_;

}
sub hoge3 : Chained('chain') PathPart('hoge')  Args(2) {
    my $self = shift;
    my ($c, @args) = @_;
}

chained の使い方については sasata299
まとめてくれているので分かりやすかった。
CatalystのChainedアクションを使いこなすための3つのルール

また CatalystのChainedアクションの連鎖を止める方法 このエントリーも併せてみとくといいかも。

多謝多謝

追記 2009-05-19 12:50:11

id:typester さんに Path アクションでやる方法を教えてもらった。(TL)

sub hoge1 :P ath('hoge') :Args(2) {
    my $self = shift;
    my ($c) = @_;
}

sub hoge2 :P ath('hoge') :Args(1) {
    my $self = shift;
    my ($c, @args) = @_;

}

sub hoge3 :P ath('hoge') :Args(0) {
        my $self = shift;
    my ($c) = @_;

}

さらに注意点も教えてもらった。
以下 TL の引用。

  • Pathアクションは同じパスだと後から書いた方が優先されるので、Argsは多い順に定義しないとダメ
  • Args多いのを後から書くとそれに全部持って行かれる
  • さらにちなむと index :P ath とか default :P ath とかはどこに書いても優先されるけど、これは専用のDispatchTypeがあり、Pathアクションではないのです

勉強になった。色々な方法があってやっぱおもしろい。
ありがとうございました〜

コメントはまだありません

コメントはまだありません。

このコメント欄の RSS フィード TrackBack URI

コメントをどうぞ

WordPress Themes