[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