デフォルトアクションの取り扱い

scaffold で作成したコントローラでは、default : Private になっていると思いますが、これだと引数の取り方が微妙です。http://d.hatena.ne.jp/holidays-l/20070516/p4 を見て初めて知ったのですが、default : Path にすると期待通りの動作になります。マニュアルはちゃんと読めということですね(汗)

package MyApp::Controller::Hoge::Fuga;

sub default : Path {
    my ( $self, $c ) = @_;
    my $method = shift @{$c->req->args};
    $c->forward($method);
}

sub action1 : Private {
    my ( $self, $c, @args ) = @_;
}

sub action2 : Private {
    my ( $self, $c, @args ) = @_;
}

1;
  • 外から呼んでもいいアクションを Private にします
  • 上の例で /hoge/fuga/action1/1/2 にアクセスすれば action1 が呼ばれ、引数に 1, 2 が渡されます
  • 上の例で /hoge/fuga/action2/3 にアクセスすれば action1 が呼ばれ、引数に 3 が渡されます
  • 上の例で /hoge/fuga/action3 にアクセスしても $c->forward 中でエラーにしてくれるのでセキュリティ上安心です
  • ちなみに各メソッドの @args は $c->req->args と同じもので、任意の引数は渡せないっぽいです
    • これは Catalyst のバージョンによる模様です・・
  • これを権限チェックと結びつければ、親クラスに定義してあっても実際には呼び出しできないような処理を実現できます