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"