req -> res, ticket #22
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Manual / Cookbook.pod
index 07e9794..2c1b139 100644 (file)
@@ -208,7 +208,7 @@ To log in a user you might use an action like this:
             $c->session_login($c->req->params->{username}, 
                               $c->req->params->{password} );
             if ($c->req->{user}) {
-                $c->forward('?restricted_area');
+                $c->forward('/restricted_area');
             }
         }
     }
@@ -266,22 +266,22 @@ with:
     sub add : Local {
         my ($self, $c) = @_;
         if ($c->roles(qw/admin/)) {
-            $c->req->output("Your account has the role 'admin.'");
+            $c->res->output("Your account has the role 'admin.'");
         } else {
-            $c->req->output("You're not allowed to be here.");
+            $c->res->output("You're not allowed to be here.");
         }
     }
 
 One thing you might need is to forward non-authenticated users to a login 
 form if they try to access restricted areas. If you want to do this 
 controller-wide (if you have one controller for your admin section) then it's 
-best to add a user check to a '!begin' action:
+best to add a user check to a 'begin' action:
 
     sub begin : Private {
         my ($self, $c) = @_;
         unless ($c->req->{user}) {
             $c->req->action(undef);  ## notice this!!
-            $c->forward('?login');
+            $c->forward('/user/login');
         }
     }
 
@@ -485,8 +485,7 @@ When using Apache, you can completely bypass Catalyst and the Static
 controller by intercepting requests for the C<root/static> path at the
 server level. All that is required is to define a DocumentRoot and add a
 separate Location block for your static content. Here is a complete
-config for this application under mod_perl 1.x; variations, some of
-which could be simpler, are left as an exercise for the reader:
+config for this application under mod_perl 1.x:
 
     <Perl>
         use lib qw(/var/www/MyApp/lib);
@@ -505,6 +504,13 @@ which could be simpler, are left as an exercise for the reader:
         </LocationMatch>
     </VirtualHost>
 
+And here's a simpler example that'll get you started:
+
+    Alias /static/ "/my/static/files/"
+    <Location "/static">
+        SetHandler none
+    </Location>
+
 =head2 Forwarding with arguments
 
 Sometimes you want to pass along arguments when forwarding to another
@@ -588,6 +594,58 @@ This is equivalent to:
 
 See also L<YAML>.
 
+=head2 Using existing CDBI (etc.) classes with Catalyst
+
+Many people have existing Model classes that they would like to use with
+Catalyst (or, conversely, they want to write Catalyst models that can be
+used outside of Catalyst, e.g.  in a cron job). It's trivial to write a
+simple component in Catalyst that slurps in an outside Model:
+
+    package MyApp::M::Catalog;
+    use base qw/Catalyst::Base Some::Other::CDBI::Module::Catalog/;
+    1;
+
+and that's it! Now C<Some::Other::CDBI::Module::Catalog> is part of your
+Cat app as C<MyApp::M::Catalog>.
+
+=head2 Delivering a Custom Error Page
+
+By default, Catalyst will display its own error page whenever it
+encounters an error in your application. When running under C<-Debug>
+mode, the error page is a useful screen including the error message and
+a full Data::Dumper output of the C<$c> context object. When not in
+C<-Debug>, users see a simple "Please come back later" screen.
+
+To use a custom error page, use a special C<end> method to short-circut
+the error processing. The following is an example; you might want to
+adjust it further depending on the needs of your application (for
+example, any calls to C<fillform> will probably need to go into this
+C<end> method; see L<Catalyst::Plugin::FillInForm>).
+
+    sub end : Private {
+        my ( $self, $c ) = @_;
+    
+        if ( scalar @{ $c->error } ) {
+            $c->stash->{errors}   = $c->error;
+            $c->stash->{template} = 'errors.tt';
+            $c->forward('MyApp::View::TT');
+            $c->{error} = [];
+        }
+    
+        return 1 if $c->response->status =~ /^3\d\d$/;
+        return 1 if $c->response->body;
+    
+        unless ( $c->response->content_type ) {
+            $c->response->content_type('text/html; charset=utf-8');
+        }
+    
+        $c->forward('MyApp::View::TT');
+    }
+
+You can manually set errors in your code to trigger this page by calling
+
+    $c->error( 'You broke me!' );
+
 =head1 AUTHOR
 
 Sebastian Riedel, C<sri@oook.de>
@@ -596,8 +654,7 @@ Viljo Marrandi, C<vilts@yahoo.com>
 Marcus Ramberg, C<mramberg@cpan.org>
 Jesse Sheidlower, C<jester@panix.com>
 Andy Grundman, C<andy@hybridized.org> 
-Marcus Ramberg C<mramberg@cpan.org>
-Chisel Wright C<pause@herlpacker.co.uk>
+Chisel Wright, C<pause@herlpacker.co.uk>
 
 =head1 COPYRIGHT