[Catalyst] RFC $c->uri_to
Ash Berlin
ash_cpan at firemirror.com
Wed Jan 3 20:04:11 GMT 2007
Michael Reece wrote:
> $c->uri_for() is great and all, but i usually am more interested in
> getting a uri for an action rather than a uri to a template (or public
> path).
>
> (incidentally, i feel uri_for would be better named uri_to, and the sub
> below named uri_for, but i digress.)
>
> the following code is what i have come up with. i present it here for
> feedback, comments, etc.
>
> ## my $uri = $c->uri_to( $controller_path, @path_args );
> ## my $uri = $c->uri_to( $controller_path, @path_args, \%query_args );
> ## my $uri = $c->uri_to( $controller_path, @path_args, \@snippets );
> # for :Regex() actions
> # $controller_path is '/controller/method' (preferred) or 'method' (in
> current $c->controller)
> sub uri_to {
> my $c = shift;
> my $namespace = shift;
> my @args = @_;
>
> my @path_args;
> my $snippets;
> my $query;
> foreach (@args) {
> if (ref eq 'ARRAY') {
> $snippets = $_;
> } elsif (ref eq 'HASH') {
> $query = $_;
> } else {
> push @path_args, $_;
> }
> }
>
> my $path = $namespace;
> unless ($path =~ m{^/}) {
> my $ns = $c->namespace; # get current namespace
> if ($ns eq '') {
> $path = "/$path"; # Root controller has namespace=''
> } else {
> $path = "/$ns/$path";
> }
> }
>
> my $action = $c->dispatcher->get_action_by_path($path);
> unless ($action) {
> $c->log->error("uri_to cannot get_action_by_path($path)");
> return undef;
> }
>
> my @action_args = (defined $snippets) ? @$snippets : ();
> my $uri = $c->dispatcher->uri_for_action($action, @action_args);
> unless ($uri) {
> $c->log->error("uri_to cannot find uri_for_action $action");
> return undef;
> }
>
> my @uri_args = (defined $query) ? ($query) : ();
> $uri = $c->uri_for("$uri", @path_args, @uri_args); # "stringify"
> important here
> return $uri;
> }
>
> there is a good chance i am re-inventing a wheel here!
>
Take a look at uri_for_aciton in
http://dev.catalystframework.org/browser/branches/Catalyst-Runtime-ctx-uri_for_action
(see t/unit_core_uri_for_action.t) and tell me if that does what you
wanted or not.
Ash
More information about the Catalyst
mailing list