I’ve been using Catalyst quite a bit recently. For those of you who don’t know what Catalyst is, the easiest buzzword compliant comparison is Ruby On Rails for Perl.
Normally in Catalyst if you want to break the flow from a current method, you use the forward
method of the catalyst object to internally redirect to a new handler.
Imagine I have a handler responding to requests at /test
.
If I want my request to be dealt with by the handler at /robspage
I can issue a forward request in the handler at /test
like this…
$c->forward($c->uri_for('/robspage'));
## code will continue here.
Once the code at /robspage
has run, control returns to the calling handler.
This isn’t always what is needed, if I don’t want the handler to return and keep running I would need to use the detach
method instead.
$c->detach($c->uri_for('/robspage'));
## code will not continue here.
This is great, however, the calling URL will not change and the user will not know they are actually seeing /robspage
instead of /test
. Sometimes this is the behaviour we want, however in this case I want the user to know a redirect has happened and for this to be reflected in their browser.
To achieve this, we have to use the redirect
method of the the response
object.
$c->res->redirect($c->uri_for('/robspage'));
$c->detach();
Note that I have added a $c->detach();
call after the redirect as I don’t want the processing chain to continue.
Thank you! This is exactly what i was looking for.