[Catalyst] uri_for() and Chained endpoints: a proposed convenience method

Ash Berlin ash_cpan at firemirror.com
Fri Jan 26 20:59:30 GMT 2007


Jason Gottshall wrote:
> In using chained dispatch, I found that getting URIs for specific
> endpoints felt a bit clumsy:
>
>   package MyApp::C::Foo;
>
>   sub get_foo : Chained('/')   PathPart('foo') CaptureArgs(0) {}
>   sub do_bar  : Chained('foo') PathPart('bar') Args(2) {}
>
>   package MyApp::C::Qux
>
>   sub index: Private {
>     my ( $self, $c ) = @_;
>     my $query = { search => 'something' };
>
>     # redirect to "/foo/bar/baz/qux?search=something"
>     $c->res->redirect( 
>       $c->uri_for->( 
>         $c->controller('Foo')->action_for('do_bar'), [qw/baz qux/],
> $query
>       ) 
>     );
>   }
>
> I wanted a way to condense the fairly wordy call to
> $c->controller()->action_for(), so I added the following convenience
> method to MyApp.pm:
>
>   sub uri_for_endpoint {
>     my ( $c, $endpoint, @args ) = @_;
>     my ( $controller, $action ) = ( split m[/], $endpoint, 2 )[ -2, -1
> ];
>     return $c->uri_for( 
>       $c->controller($controller)->action_for($action), 
> 	@args
>     );
>   }
>
> Now I can rewrite the call to uri_for() like this:
>
>   #   $c->uri_for->( 
>   #     $c->controller('Foo')->action_for('do_bar'), [qw/baz qux/],
> $query
>   #   )
>       $c->uri_for_endpoint( 'foo/do_bar', [qw/baz qux/], $query )
>
> My questions to the list are as follows:
>
> 1) Is my convenience method a sensible approach, or is there a "better"
> way to do this?
> 2) The method I wrote seems to work correctly. Did I miss anything?
> 3) Is this useful enough to other folks to be worth adding to the dist
> somewhere?
>
> All feedback (including things like "You're too lazy") appreciated!
>   
I made an attempt at this before - my code is in 
http://dev.catalyst.perl.org/browser/branches/Catalyst-Runtime-ctx-uri_for_action

See inparticular 
http://dev.catalyst.perl.org/browser/branches/Catalyst-Runtime-ctx-uri_for_action/t/unit_core_uri_for_action.t 
(I think)

Ash



More information about the Catalyst mailing list