defaultアクションの取り扱い

Devel::Bayside - デフォルトアクションの取り扱い

自分はdefaultアクションをRoot.pmだけに書いて、404 Not Foundを返すようにしています。

package MyApp::Controller::Root;

sub default : Path {
    my ( $self, $c ) = @_;
    $c->res->status(RC_NOT_FOUND);
}

他のコントローラでdefaultアクションっぽく動かしたい場合は、LocalRegexを使っています。

sub retrieve : LocalRegex('^([a-zA-Z0-9_]+)$') {
    my ( $self, $c ) = @_;
    my $arg = $c->req->captures->[0];
}

こうしておけば変なPATH_INFOを渡されても、Root#defaultに飛ぶので安全です。


ちなみに各メソッドの @args は $c->req->args と同じもので、任意の引数は渡せないっぽいです

sub default : Path {
    my ( $self, $c ) = @_;
    my $method = shift @{$c->req->args};
    $c->forward($method, ['任意', 'の', '引数']);
}

こういうことではない?

ちなみにこれ、昔から普通にできると思ってたんですが、マニュアルを見ると5.30以降と書いてありました。
See the Catalyst::Manual::Cookbook/"Forwarding with arguments" and Catalyst::Manual::Intro/"Flow Control"