[Catalyst] stripping path parts and then redispatch?
Larry Leszczynski
larryl at emailplus.org
Mon Feb 23 17:08:01 GMT 2009
Hi Lars -
> > I have an existing site, and want to add the page language to the URLs
> > so that caching will work correctly, e.g. "/foo/bar" would now look like
> > "/en/foo/bar" or "/fr/foo/bar".
>
> Apart from the missing true return value from auto, this works:
>
> http://lists.scsys.co.uk/pipermail/catalyst/2009-February/021072.html
Thanks for the pointer. But this approach only seems to work for Local
actions, not Private actions like default(). E.g. using these
controllers:
#------------------------------------------------
package MyApp::Controller::Foo;
use parent 'Catalyst::Controller';
sub default :Private {
my ($self, $c, @args) = @_;
$c->response->body("Foo args: @args");
}
sub bar :Local {
my ($self, $c, @args) = @_;
$c->response->body("Foo::Bar args: @args");
}
#------------------------------------------------
package MyApp::Controller::En;
use parent 'Catalyst::Controller';
sub default :Private {
my ($self, $c, @args) = @_;
my $path = $c->request->path;
$path =~ s{^en}{};
$c->go($path, []);
}
#------------------------------------------------
The paths "/en/foo/bar" or "/en/foo/bar/arg1" work as expected, but if I
try to hit "/en/foo" I get an error message:
Couldn't go to command "/foo":
Invalid action or component.
because the action name it wants is really "/foo/default", not just
"/foo".
For a path like "/a/b/c", I would need to figure out whether to do this:
# Will hit: A::B with arg 'c'
# or: A::B::C with no args
#
$c->go("/a/b/c", []);
vs this:
$c->go("/a/default", ['b', 'c']);
vs this:
$c->go("/a/b/default", ['c']);
?
I'm guessing there must be a way to use the Dispatcher to figure out,
for a given path, how to make go() work consistently, but I have not yet
found the trick for making this work...
Thanks!
Larry
More information about the Catalyst
mailing list