[Catalyst] URL mapping relative to Controller name space.
    Bill Moseley 
    moseley at hank.org
       
    Sat Jul 30 06:07:48 CEST 2005
    
    
  
I'm trying to write controllers that don't need to know where they are
located.
I want a single controller to handle a number of tables (say, it's a
general CRUD handler for a collection of tables) with paths like:
    http://localhost:3000/admin/crud/<table>/list
    http://localhost:3000/admin/crud/<table>/edit/<id>
    http://localhost:3000/admin/crud/<table>/do_edit/<id>
I'd like the code in the controller to be relocatable -- that is, if I
move it to a new location in (in URL space) the code doesn't need to
be updated.  I like using "Local" actions in general, but seems that's
not a good choice in this case due to the <table> variable before the
action.
What I'm currently doing is something like:
    package MyApp::C::Admin::Crud;
    sub default : Private {
        my ( $self, $c, $admin, $crud, $table, $action, $id ) = @_;
        [...]
    }
where $admin and $lookup are there to eat up those path segments.  The
(minor) problem is that if I some day moved this controller to:
    package MyApp::C::Admin::Foo::Bar::Crud;
then I'd need to adjust the parameters passed to default().
What I'd like is a way to get the path segments relative to the
controller.  So my default() sub would look like
    sub default : Private {
        my ( $self, $c, $table, $action, $id ) = @_;
        [...]
        $c->forward( $action ) if $self->can($action);
    }
regardless of where it's located in URL space. $table, $action, $id
are the path segments after the name of the package.
Related, how do I generate self-referential hrefs in my templates?
>From my examples above, in the first case I'd want:
    $c->stash->{root} = '/admin/crud';
and when the controller is relocated it would instead be:
    $c->stash->{root} = '/admin/foo/bar/crud';
That is, every URL handled by the controller is relative to its
package name.
In some ways I wish I could do this at the top of my controller:
    package __right_here__;
and have the package set based on where it is in the path. ;)
Thanks,
-- 
Bill Moseley
moseley at hank.org
    
    
More information about the Catalyst
mailing list