logo
Free, unlimited AI code reviews that run on commit
git-lrc git-lrc GitHub Install Now We'd appreciate a star git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt

Catalyst::Manual::Actions - Catalyst Reusable Actions

Action Roles

       You can only have one action class per action, which can be somewhat inflexible.

       The solution to this is to use Catalyst::Controller::ActionRole, which would make the example above look
       like this:

           package Catalyst::ActionRole::MyActionRole;
           use Moose::Role;

           before 'execute' => sub {
               my ( $self, $controller, $c, $test ) = @_;
               $c->stash->{what} = 'world';
           };

           after 'execute' => sub {
               my ( $self, $controller, $c, $test ) = @_;
               $c->stash->{foo} = 'bar';
           };

           1;

       and this would be used in a controller like this:

           package MyApp::Controller::Foo;
           use Moose;
           use namespace::autoclean;
           BEGIN { extends 'Catalyst::Controller::ActionRole'; }

           sub foo : Does('MyActionRole') {
               my ($self, $c) = @_;
           }

           1;

Authors

       Catalyst Contributors, see Catalyst.pm

Description

       This section of the manual describes the reusable action system in Catalyst, how such actions work,
       descriptions of some existing ones, and how to write your own.  Reusable actions are attributes on
       Catalyst methods that allow you to decorate your method with functions running before or after the method
       call.  This can be used to implement commonly used action patterns, while still leaving you full freedom
       to customize them.

Example Actionroles

Catalyst::ActionRole::ACL
       Provides ACLs for role membership by decorating your actions.

Example Actions

Catalyst::Action::RenderView
       This is meant to decorate end actions. It's similar in operation to Catalyst::Plugin::DefaultEnd, but
       allows you to decide on an action level rather than on an application level where it should be run.

   Catalyst::Action::REST
       Provides additional syntax for dispatching based upon the HTTP method of the request.

Name

       Catalyst::Manual::Actions - Catalyst Reusable Actions

Using Actions

       This is pretty simple. Actions work just like the normal dispatch attributes you are used to, like Local
       or Private:

           sub Hello :Local :ActionClass('SayBefore') {
               $c->res->output( 'Hello '.$c->stash->{what} );
           }

       In this example, we expect the SayBefore action to magically populate stash with something relevant
       before "Hello" is run.  In the next section we'll show you how to implement it. If you want it in a
       namespace other than Catalyst::Action you can prefix the action name with a '+', for instance
       '+Foo::SayBefore', or if you just want it under your application namespace instead, use MyAction, like
       MyAction('SayBefore').

Writing Your Own Actions

       Implementing the action itself is almost as easy. Just use Catalyst::Action as a base class and decorate
       the "execute" call in the Action class:

           package Catalyst::Action::MyAction;
           use Moose;
           use namespace::autoclean;

           extends 'Catalyst::Action';

           before 'execute' => sub {
               my ( $self, $controller, $c, $test ) = @_;
               $c->stash->{what} = 'world';
           };

           after 'execute' => sub {
               my ( $self, $controller, $c, $test ) = @_;
               $c->stash->{foo} = 'bar';
           };

           __PACKAGE__->meta->make_immutable;

       Pretty simple, huh?

See Also