[Catalyst] Question about Chained Controller

Eden Cardim edencardim at gmail.com
Mon Nov 15 16:53:29 GMT 2010


>>>>> "Charlie" == Charlie Garrison <garrison at zeta.org.au> writes:

    Charlie> I've never bothered to find out why, but I've run into
    Charlie> situations where $c->user_exists returns true and $c->user
    Charlie> returns false. I just check for defined($c->user) instead
    Charlie> and that solved it for me.

Probably a mangled session?

    Charlie> I also agree with other users that auto is a better place
    Charlie> to do that check.

Chaining is a lot more powerful because it allows you to distribute
responsibilities hierarchically throughout several actions:

package MyApp::Controller::Root;

sub foo :Chained('/') CaptureArgs(0) {
  my ($self, $c) = @_;
  $c->detach unless $c->user_exists;
}

sub do_something :Chained('foo') Args(0) {}

sub bar :Chained('foo') PathPart('') CaptureArgs(0) {
  my($self, $c) = @_;
  $c->detach unless $c->assert_user_roles('bar_level_users');
}

sub do_something_else :Chained('bar') Args(0) {}

It also gives you a lot more flexbility, given you can change the
chaining via config:

<Controller::Root>
    <actions>
        <do_something_else>
            Chained foo
        </do_something_else>
    </actions>
</Controller::Root>

The above configuration will eliminate the check for the
'bar_level_users' role before running do_something_else.

-- 
     Eden Cardim            Need help with your perl Catalyst or DBIx::Class project?
   Software Engineer                   http://www.shadowcat.co.uk/catalyst/
 Shadowcat Systems Ltd.        Want a managed development or deployment platform?
http://blog.edencardim.com             http://www.shadowcat.co.uk/servers/



More information about the Catalyst mailing list