[Catalyst] Multiple chaining to same action ...

Kiffin Gish kiffin.gish at planet.nl
Mon Feb 15 21:10:01 GMT 2010


I just happened to find the answer here:

http://www.mail-archive.com/catalyst@lists.scsys.co.uk/msg07604.html

t0m++ for (1..10)

On Mon, 2010-02-15 at 21:38 +0100, Kiffin Gish wrote:
> In my application, users are allowed to edit only their own settings
> like this:
> 
> /account/id/client/settings/edit
> 
> | /role/*/settings/edit | /auth (0)                       |
> |                       | -> /role/base (1)               |
> |                       | -> /role/settings/crud/base (0) |
> |                       | => /role/settings/crud/edit     |
> 
> # Controller::Role
> sub base : Chained('/auth') PathPart('role') CaptureArgs(1) {
>     my ( $self, $c, $id ) = @_;
> 
>     # Get the user if possible.
>     my $user = $c->model('DB::User')->find($id);
> 
>     # Make sure that the user is indeed this user.
>     $c->detach('/error_403') unless $c->user->id == $id;
> 
>     # Save the user in the stash.
>     $c->stash( user => $user );
> }
> 
> # Controller::Role::Settings::CRUD
> sub base : Chained('/role/base') PathPart('settings') CaptureArgs(0)
> {...}
> 
> sub edit : Chained('base') PathPart('edit') Args(0) {
>     my ( $self, $c ) = @_;
>     my $user = $c->stash->{user};
>     ....
> }
> 
> Now the hard part.
> 
> I also want to allow the admin to be able to edit all user settings in
> exactly the same way, like this:
> 
> /account/id/admin/user/id/settings/edit
> 
> # Controller::Role::Admin::User
> sub base : Chained('/role/admin/base') PathPart('user') CaptureArgs(0)
> {...}
> 
> sub id : Chained('base') PathPart('') CaptureArgs(1) {
>     my ( $self, $c, $id ) = @_;
> 
>     # Get the user if possible.
>     my $user = $c->model('DB::User')->find($id);
> 
>     # Does this user exist?
>     $c->detach('/error_404') unless ($user);
> 
>     # Save the user in the stash.
>     $c->stash( user => $user );
> }
> 
> sub edit : Chained('base') PathPart('settings') Args(0) {...}
> 
> As you can see there's alot of repetition going on and there must be a
> more elegant way to handle this.
> 
> How does one go about chaining the same action from multiple points.
> Does this make sense and if so is it possible?
> 
> Thanks alot in advance,
> Kiffin
> 
> 


-- 
Kiffin Gish <Kiffin.Gish at planet.nl>
Gouda, The Netherlands





More information about the Catalyst mailing list