Catalyst::Controller::ActionRoleって...
action_rolesを指定して、コントローラ全体にmodifierかけると微妙だよね。
例えばこんな感じ。
package Umakatter::Web::Controller::Example; use strict; use warnings; use base qw/Catalyst::Controller::ActionRole/; __PACKAGE__->config( action_roles => ['~Example'], ); sub index : Path : Args(0) { my ( $self , $c ) = @_; } 1; package Umakatter::Web::ActionRole::Example; use Moose::Role; after execute => sub { my ($self, $controller, $c) = @_; $c->response->body( 'run_' . $c->response->body ); }; 1;
結果
何回も走るよね....
_DISPATCH _BEGIN _AUTO _ACTION _END とか Action登録されてるから当たり前なんだけど、どうすれば1回だけ実行させることができるのかなぁ。
関数名でスキップすることはできるけど。
package Umakatter::Web::ActionRole::Example; use Moose::Role; after execute => sub { my ($self, $controller, $c) = @_; return if( $self->name =~ /^(_BEGIN|_AUTO|_ACTION|_END|_DISPATCH)$/ ); $c->response->body( 'run_' . $c->response->body ); }; 1;
sub index : Path : Args(0) { my ( $self , $c ) = @_; $c->forward('hoge'); } sub hoge : Local { }
こうしたら、けっきょく2回よばれるからな。