[Catalyst] Cascading action dispatching

Matt S Trout dbix-class at trout.me.uk
Sun Oct 21 20:10:13 GMT 2007


On Sun, Oct 21, 2007 at 10:20:20AM -0400, Matthew Pitts wrote:
> On Fri, 2007-10-19 at 17:16 -0400, Matthew Pitts wrote:
> > 
> > I'm trying to figure out a way to have my Cat app dispatch in a way
> > that
> > would allow multiple actions in the same namespace and have them
> > called
> > in succession until one of them actually handles the request.
> > 
> > I have a client that really likes base-level URLs, like
> > "/shoppingmallxyz", and wants to use them for landing pages that are
> > functionally different. In some of these cases the base-level URL
> > paths
> > are really just monikers for things that are retrieved from the DB and
> > if it exists, then a page is rendered.
> 
> I guess another, maybe more elegant, way to accomplish this same effect
> would be to override register_actions in the Controllers where I want to
> do this and have a call to a register_dynamic_actions method like so:
> 
> package MyApp::Controller::Center;
> 
> sub register_actions {
>     my $self = shift;
>     my ( $c ) = @_;
> 
>     $self->register_dynamic_actions($c);
> 
>     return $self->SUPER::register_actions(@_);    # or NEXT?
> }
> 
> sub register_dynamic_actions {
>     my $self = shift;
>     my ( $c ) = @_;
> 
>     my $centers = $c->model('Center')->all;
> 
>     while ( my $center = $centers->next ) {
>         my $action = $self->create_action(...);
>         $c->dispatcher->register($c, $action);
>     }
> }
> 
> 1;
> 
> An obvious side-effect (AFAIK) of doing it this way is that the app has
> to be restarted for new dynamic actions to take affect. The benefit,
> however, is that the root-level pseudo-actions I was trying to achieve
> with on-the-fly DB lookups are now first class actions and would not
> require a DB call on each request.
> 
> I may be crazy... anybody got any thoughts on this?

Yes, you're crazy.

OTOH you appear to be the same same sort of crazy I was when I wrote
register_actions and intentionally factored the process in such a way
that it was overridable, so don't let that stop you implementing this.

The only better solution I can think of is to handle whether you accept the
action via an action class, but we need to add a $action->match_captures for
chain mid-points to make that elegant, currently you only get a match on the
end point which would be a bit messy to implement.

I plan to add such a method for 5.80

-- 
      Matt S Trout       Need help with your Catalyst or DBIx::Class project?
   Technical Director                    http://www.shadowcat.co.uk/catalyst/
 Shadowcat Systems Ltd.  Want a managed development or deployment platform?
http://chainsawblues.vox.com/            http://www.shadowcat.co.uk/servers/



More information about the Catalyst mailing list