=head2 env_at_action
-Localize C<$env> under the current controller path prefix:
+Localize C<$env> under the current action namespace.
package MyApp::Controller::User;
my $env = $c->Catalyst::Utils::env_at_action;
}
-Assuming you have a requst like GET /user/name:
+Assuming you have a request like GET /user/name:
In the example case C<$env> will have PATH_INFO of '/' instead of
'/user/name' and SCRIPT_NAME will now be '/user/name'.
+Alternatively, assuming you have a requst like GET /user/name/foo:
+
+In this example case C<$env> will have PATH_INFO of '/foo' instead of
+'/user/name/foo' and SCRIPT_NAME will now be '/user/name'.
+
This is probably a common case where you want to mount a PSGI application
under an action but let the Args fall through to the PSGI app.
=head2 env_at_request_uri
-Localize C<$env> under the current controller path prefix:
+Localize C<$env> under the current request URI:
package MyApp::Controller::User;
# Make it easier to mount PSGI apps under catalyst
{
+ package MyApp::Controller::Docs;
+
+ use base 'Catalyst::Controller';
+ use Plack::Request;
+ use Catalyst::Utils;
+
+ my $psgi_app = sub {
+ my $req = Plack::Request->new(shift);
+ return [200,[],[$req->path]];
+ };
+
+ sub name :Local {
+ my ($self, $c) = @_;
+ my $env = $c->Catalyst::Utils::env_at_action;
+ $c->res->from_psgi_response(
+ $psgi_app->($env));
+
+ }
+
+ sub name_args :Local Args(1) {
+ my ($self, $c, $arg) = @_;
+ my $env = $c->Catalyst::Utils::env_at_action;
+ $c->res->from_psgi_response(
+ $psgi_app->($env));
+ }
+
package MyApp::Controller::User;
use base 'Catalyst::Controller';
is_deeply $c->req->args, [444];
}
+{
+ my ($res, $c) = ctx_request('/docs/name');
+ is $c->action, 'docs/name';
+ is $res->content, '/';
+ is_deeply $c->req->args, [];
+}
+
+{
+ my ($res, $c) = ctx_request('/docs/name/111/222');
+ is $c->action, 'docs/name';
+ is $res->content, '/111/222';
+ is_deeply $c->req->args, [111,222];
+}
+
+{
+ my ($res, $c) = ctx_request('/docs/name_args/111');
+ is $c->action, 'docs/name_args';
+ is $res->content, '/111';
+ is_deeply $c->req->args, [111];
+}
done_testing();