[Catalyst-commits] r7263 -
trunk/examples/CatalystAdvent/root/2007/pen
purge at dev.catalyst.perl.org
purge at dev.catalyst.perl.org
Mon Dec 10 22:30:07 GMT 2007
Author: purge
Date: 2007-12-10 22:30:07 +0000 (Mon, 10 Dec 2007)
New Revision: 7263
Modified:
trunk/examples/CatalystAdvent/root/2007/pen/5.pod
Log:
catadvent entry
Modified: trunk/examples/CatalystAdvent/root/2007/pen/5.pod
===================================================================
--- trunk/examples/CatalystAdvent/root/2007/pen/5.pod 2007-12-10 22:07:55 UTC (rev 7262)
+++ trunk/examples/CatalystAdvent/root/2007/pen/5.pod 2007-12-10 22:30:07 UTC (rev 7263)
@@ -1,81 +1,105 @@
-*UNFINISHED* =head1 Day 11 - $c->uri_for fun and profit *UNFINISHED*
+=head1 Day 11 - $c->uri_for fun and profit
Today we will take a trip into the wonderful and mystical world of uri_for.
-The basic premise behind uri_for is to make generating URLs for actions with parameters easy and fun. Lets look at some examples.
+The basic premise behind uri_for is to make generating URIs for actions with parameters easy and fun (well as fun as URIs get).
-=head3 Basic uri_for
-$c->uri_for will return the URL for the current actions namespace, so, if you are in Controller MyApp::Foo it will return http://localhost:3000/foo for any action you are running in that controller. If you wanted to get to a specific action you can do
+=head2 Basic uri_for
+$c->uri_for will return the URL for the current actions namespace, so, if you are in Controller MyApp::Children it will return
-$c->uri_for('actionname') which would give you http://localhost:3000/foo/actioname
+ http://localhost:3000/children
-What if I wanted to get outside of the 'foo' namespace? well, use a / to root it :
+for any action you are running in that controller.
+If you wanted to get to a specific action you can do
-$c->uri_for('/actionname')
-http://localhost:3000/actionname
+ $c->uri_for('good') which would give you http://localhost:3000/child/good
+
+What if I wanted to get outside of the 'child' namespace? well, use a / to root it :
+
+ $c->uri_for('/elves')
+ http://localhost:3000/elves
For most cases this simple construct is more than adequate but a more canonical way is via the action_for construct for instance, If in my controller i have
-sub add :Path('pathliabletochange') {
-...
+ sub deliverto :Path('good') {
+ ...
+ }
I could refer to this action in the current namespace as follows
-$c->uri_for($c.action_for('add'))
-http://localhost:3000/foo/pathliabletochange
+ $c->uri_for($c.action_for('deliverto'))
+ http://localhost:3000/children/good
+
If, in the future i decided to change my URI structure all the references to this controller would update accordingly.
This technique also has other uses we will come to later.
-=head3 Adding parameters
+=head2 Adding parameters
You can easily add parameters to the uri_for object like this:
-$c->uri_for(undef,{a => b, c => d});
-http://localhost:3000/?a=b&c=d
+ $c->uri_for('house',{fire => 0, mincepie => 1});
+ http://localhost:3000/house?chimney=0&mincepie=1
or even in a TT template:
-[% c.uri_for('bar',{a => b, c => d}) %]
-http://localhost:3000/bar?a=b&c=d
-or
+ [% c.uri_for('house',{fire => 0, mincepie => 1}) %]
+ http://localhost:3000/house?chimney=0&mincepie=1
-[% c.uri_for('bar',c.req.params) %]
-http://localhost:3000/bar?a=b&c=d (assuming parameters passed in to page were a=b c=d)
+or you could use the params that were passed into the page to re-populate it
-=head Complex paths with captures
+ [% c.uri_for('bar',c.req.params) %]
+ http://localhost:3000/bar?a=b&c=d (assuming parameters passed in to page were a=b c=d)
+
+=head2 Complex paths with captures
+
uri_for makes it incredibly easy to create and adjust paths for chained actions, for instance
-$c.uri_for($c.action,$c.req.captures,'new');
+ $c.uri_for($c.action,$c.req.captures,'print');
would fill out all the captures in the current uri and add new to it
-http://localhost:3000/foo/4/bar/new
+http://localhost:3000/house/4/address/print
-=head3 uri_for internals
+But what if you wanted to change some of the captures... say for linking from a list - well it's just an array so thats easy :
-uri_for returns a URI object so you can do all the usual tricks, for instance, say you were wanting to go to a secure section of your catalyst site you could do the following
+ $c.uri_for($c.action,[2],'new');
+ http://localhost:3000/house/2/address/print
-my $uri = c.uri_for('secure');
-$uri->scheme('https');
-https://localhost:3000/foo/secure
+=head2 uri_for internals
+uri_for returns a normalised URI object so you can do all the usual tricks, for instance, say you were wanting to go to a secure section of your catalyst site you could do the following :
+ my $uri = c.uri_for('secure');
+ $uri->scheme('https');
+ https://localhost:3000/letters/list
+=head2 useful code snippets
-sub action_uri {
- my ($c, $controller, $action, @params) = @_;
- return $c->uri_for($c->controller($controller)->action_for($action), @params);
-}
+You could add these in your root controller to make them available for all your actions.
+(thanks zamolxes!)
-sub redirect_to_action {
- my ($c, $controller, $action, @params) =@_;
- $c->response->redirect($c->uri_for($c->controller($controller)->action_for($action), @params));
- $c->detach;
-}
+ sub action_uri {
+ my ($c, $controller, $action, @params) = @_;
+ return $c->uri_for($c->controller($controller)->action_for($action), @params);
+ }
+ sub redirect_to_action {
+ my ($c, $controller, $action, @params) =@_;
+ $c->response->redirect($c->uri_for($c->controller($controller)->action_for($action), @params));
+ $c->detach;
+ }
+ <a href="[% c.action_uri('Foo::Bar','baz',5) %]">BAZ!</a>
+
+ $c->redirect_to_action('User','login');
+
=head2 Links to documentation
+B<URI>
+B<Catalyst>
+
=head1 AUTHOR
-purge
+Simon Elliott (purge, cpan at browsing.co.uk)
+
+=cut
\ No newline at end of file
More information about the Catalyst-commits
mailing list