Cleaned up Tut files; no substantive changes
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Manual / Tutorial.pod
index eb1af71..91d11ac 100644 (file)
 =head1 NAME
 
-Catalyst::Manual::Tutorial - Getting started with Catalyst
+Catalyst::Manual::Tutorial - Catalyst Tutorial: Overview
+
+
 
 =head1 DESCRIPTION
 
-This document aims to get you up and running with Catalyst.
-
-NOTE: THIS DOCUMENT IS STILL VERY MUCH IN AN EARLY DRAFT STATE.  SEE 
-THE NOTES AT THE BOTTOM OF THE DOCUMENT.
-
-=head2 Installation
-
-The first step is to install Catalyst, and the simplest way to do this 
-is to install the Catalyst bundle from CPAN:
-
-    $ perl -MCPAN -e 'install Bundle::Catalyst'
-
-This will retrieve Catalyst and a number of useful extensions and 
-install them for you.
-
-
-=head2 Setting up your application
-
-Catalyst includes a helper script, C<catalyst.pl>, that will set up a 
-skeleton application for you:
-
-    $ catalyst.pl My::App
-    created "My-App"
-    created "My-App/script"
-    created "My-App/lib"
-    created "My-App/root"
-    created "My-App/t"
-    created "My-App/t/m"
-    created "My-App/t/v"
-    created "My-App/t/c"
-    created "My-App/lib/My/App"
-    created "My-App/lib/My/App/M"
-    created "My-App/lib/My/App/V"
-    created "My-App/lib/My/App/C"
-    created "My-App/lib/My/App.pm"
-    created "My-App/Makefile.PL"
-    created "My-App/README"
-    created "My-App/Changes"
-    created "My-App/t/01app.t"
-    created "My-App/t/02podcoverage.t"
-    created "My-App/script/cgi.pl"
-    created "My-App/script/nph-cgi.pl"
-    created "My-App/script/fcgi.pl"
-    created "My-App/script/server.pl"
-    created "My-App/script/test.pl"
-    created "My-App/script/create.pl"
+The Catalyst framework is a flexible and comprehensive environment for
+quickly building high-functionality web applications.  This tutorial is
+design to provide a rapid introduction to its basics and most commonly
+used features while focusing on real-world best practices.
+
+The tutorial is broken down into the following sections:
+
+=over 4
+
+=item *
+
+L<Introduction|Catalyst::Manual::Tutorial_Intro>
+
+=item * 
+
+L<Catalyst Basics|Catalyst::Manual::Tutorial_CatalystBasics>
+
+=item * 
+
+L<CRUD|Catalyst::Manual::Tutorial_BasicCRUD>
+
+=item * 
+
+L<Authentication|Catalyst::Manual::Tutorial_Authentication>
+
+=item * 
+
+L<Authorization|Catalyst::Manual::Tutorial_Authorization>
+
+=item * 
+
+L<Debugging|Catalyst::Manual::Tutorial_Debugging>
+
+=item * 
+
+L<Testing|Catalyst::Manual::Tutorial_Testing>
+
+=item * 
+
+L<CRUD|Catalyst::Manual::Tutorial_AdvancedCRUD>
+
+=item * 
+
+L<Appendicies|Catalyst::Manual::Tutorial_Appendicies>
+
+=back
+
+
+Full source code is available for each section via the main Catalyst
+Subversion repository at
+L<http://dev.catalyst.perl.org/repos/Catalyst/trunk/examples/>.  See the
+end of each section for the specifics on retrieving code for that
+section.
+
+A tarball of the final application is available at
+C<to_be_compled_in_final_version>.
 
-This creates the directory structure shown, populated with skeleton 
-files.
+=head1 Detailed Table Of Contents
 
+=head2 Part 1: Introduction
 
+=over 4
 
-=head2 Testing out the sample application
+=item *
 
-You can test out your new application by running the server script that
-catalyst provides:
+VERSIONS AND CONVENTIONS USED IN THIS TUTORIAL
 
-    $ cd My-App
-    $ script/server.pl 
-    [...] [catalyst] [debug] Debug messages enabled
-    [...] [catalyst] [debug] Loaded engine "Catalyst::Engine::HTTP"
-    [...] [catalyst] [debug] Loaded private actions
-    .=----------------------+----------------------+---------------=.
-    | Private               | Class                | Code           |
-    |=----------------------+----------------------+---------------=|
-    | /default              | MyApp                | CODE(0x86f08ac |
-    '=----------------------+----------------------+---------------='
-     "My::App" defined "!default" as "CODE(0x83fd570)"
-    [...] [catalyst] [info] My::App powered by Catalyst 5.00
-    You can connect to your server at http://localhost:3000
+=item *
 
-(Note that each line logged by Catalyst includes a timestamp, which has
-been replaced here with "C<...>" so that the text fits onto the lines.)
+CATALYST INSTALLATION
 
-The server is now waiting for you to make requests of it.  Try using 
-telnet to manually make a simple GET request of the server (when 
-telnet responds with "Escape character is '^]'.", type "GET / HTTP/1.0"
-and hit return twice):
+=item *
 
-    $ telnet localhost 3000
-    Trying 127.0.0.1...
-    Connected to localhost.
-    Escape character is '^]'.
-    GET / HTTP/1.0
-    
-    HTTP/1.0 200
-    Server: Catalyst/5.00
-    Status: 200
-    Date: Sun, 20 Mar 2005 12:31:55 GMT
-    X-catalyst: 5.00
-    Content-length: 40
-    Content-Type: text/html; charset=ISO-8859-1
+DATABASES
 
-    Congratulations, My::App is on Catalyst!
-    Connection closed by foreign host.
-    $
+=item *
 
-More trace messages will appear in the original terminal window:
+WHERE TO GET WORKING CODE
 
-    [...] [catalyst] [debug] ********************************
-    [...] [catalyst] [debug] * Request 1 (0.027/s) [9818]
-    [...] [catalyst] [debug] ********************************
-    [...] [catalyst] [debug] "GET" request for "" from localhost
-    [...] [catalyst] [info] Request took 0.051399s (19.456/s)
-    .=--------------------------------------------------+----------=.
-    | Action                                            | Time      |
-    |=--------------------------------------------------+----------=|
-    | /default                                          | 0.000026s |
-    '=--------------------------------------------------+----------='
+=back
 
-The server will continue running until you interrupt it.
 
-The application can also be tested from the command line using the generated
-helper script, C<script/test.pl>.
+=head2 Part 2: Catalyst Application Development Basics
 
+=over 4
 
-=head2 Getting your application invoked
+=item *
 
-Catalyst applications are usually run from mod_perl, but can also be
-run as CGI or FastCGI scripts.  Running under mod_perl gives better 
-performance, but for development purposes you may want to run your 
-application as a CGI script, especially as changes to your application 
-code take effect under CGI without having to restart the web server.
+CREATE A CATALYST PROJECT
 
-To run from mod_perl you need to add something like this to your Apache
-configuration file:
+=item *
 
-    <Location /my-app>
-        SetHandler  perl-script
-        PerlHandler My::App
-    </Location>
+CREATE A SQLITE DATABASE
 
-To run as a CGI script you need a wrapper script like:
+=item *
 
-    #!/usr/bin/perl -w
+EDIT THE LIST OF CATALYST PLUGINS
 
-    use strict;
-    use lib '/path/to/My/App/lib';
-    use My::App;
+=item *
 
-    My::App->run;
+DATABASE ACCESS WITH DBIx::Class
 
+=over 4
 
+=item *
 
-=head2 Examining the generated code
+Create a DBIC Schema File
 
-The generated application code is quite simple and looks something 
-like this:
+=item *
 
-    package My::App;
+Create the DBIC ``Result Source'' Files
 
-    use strict;
-    use Catalyst qw/-Debug/;
+=item *
+
+Use Catalyst::Model::DBIC::Schema To Load The Model Class
+
+=back
 
-    our $VERSION = '0.01';
+=item *
 
-    My::App->config(
-    name => 'My::App',
-    root => '/home/andrew/My-App/root',
-    );
+CREATE A CATALYST CONTROLLER
 
-    __PACKAGE__->setup();
+=item *
 
-    sub default : Private {
-      my ( $self, $c ) = @_;
-      $c->res->output('Congratulations, My::App is on Catalyst!');
-    }
+CATALYST VIEWS
 
-    1;
+=over 4
 
+=item *
 
-When the C<Catalyst> module is imported by the application code, 
-Catalyst performs the first stage of its initialization.  This includes
-loading the appropriate Engine module for the environment in which the 
-application is running, loading any plugins and ensuring that the 
-calling module (the application module) inherits from C<Catalyst> 
-(which makes the Catalyst methods C<config> and C<setup> available to 
-the application module).
+Create a Catalyst View Using TTSITE
 
-The call to C<config> sets up configuration data for the application.  
-The C<name> and C<root> items are the minimum required, and specify 
-the name of the application and the path to the root directory where 
-documents, images and templates can be found.
+=item *
 
-Catalyst associates I<actions> with URLs and on receiving a request 
-dispatches to the action that matches to request URL.  The call to 
-C<setup> in the code above registers a default action.  With just 
-this action registered the application will respond to all requests 
-with the same message "Congratulations, My::App is on Catalyst!".
+Globally Customize Every View
 
-As you see, the default action is defined as a Private action. 
-Most private actions are not directly available from a web url. The
-exceptions are the built-in actions, 'default','begin','end' and
-'auto'. The rest can only be reached by using C<forward>.
+=item *
 
+Create a TT Template Page
 
-The call to the C<setup> method also triggers the second stage of 
-Catalyst's initialization process.  In this phase Catalyst searches 
-for any component modules, locating and registering any actions it 
-finds in those modules.
+=back
 
-Component modules have names prefixed with the application module name,
-followed by C<Model>, C<View> or C<Controller> (or the default short
-forms: C<M>, C<V> or C<C>) followed by the component name, for example:
+=item *
 
-    My::App::Controller::ShoppingCart  # long version
-    My::App::C::ShoppingCart           # short version 
+RUN THE APPLICATION
 
+=back
 
 
-=head2 Extending the generated code
+=head2 Part 3: Basic CRUD
 
+=over 4
 
-You can start extending the application by adding new actions:
+=item *
 
-    sub test1 : Global {
-      my ( $self, $c ) = @_;
-      $c->res->output('In a new test action #1');
-    }
-    sub default : Private {
-      my ( $self, $c ) = @_;
-      $c->res->output('Congratulations, My::App is on Catalyst!');
-    }
+FORMLESS SUBMISSION
 
+=over 4
 
-TODO: explain briefly about plugins, actions and components
+=item *
 
-regex actions passed subexpression matches in $c->req->snippets
-(array ref).
+Include a Create Action in the Books Controller
 
+=item *
 
-=head2 Hooking in to Template Toolkit
+Include a Template for the url_create Action:
 
-One of the first things you will probably want to add to your 
-application is a templating system for generating your output.  
-Catalyst works well with Template Toolkit.  If you are unfamiliar with 
-Template Toolkit then I suggest you look at L<http://tt2.org>, install 
-C<Template>, read the documentation and play around with it, and have 
-a look at the I<Badger Book> (I<Template Toolkit> by Darren 
-Chamberlain, Dave Cross and Andy Wardly, O'Reilly & Associates, 2004).
+=item *
 
-You can create a stub Template Toolkit view component using the create 
-script that Catalyst set up as part of the skeleton application:
+Try the url_create Feature
 
-    $ script/create.pl view TT TT
+=back
 
-this generates a view component named C<My::App::View::TT>, which you 
-might use by forwarding from your C<end> action:
+=item *
 
-    # In My::App or My::App::Controller::SomeController
+MANUALLY BUILDING A CREATE FORM
 
-    sub end : Private {
-        my($self, $c) = @_;
-        $c->forward('My::App::View::TT');
-    }
+=over 4
 
-The generated TT view component simply subclasses the 
-C<Catalyst::View::TT> class.  It looks like this (with the POD 
-stripped out): 
+=item *
 
-    package My::App::V::TT;
+Add Method to Display The Form
 
-    use strict;
-    use base 'Catalyst::View::TT';
+=item *
 
-    1;
+Add a Template for the Form
 
-C<Catalyst::View::TT> initializes a Template Toolkit object with an 
-options hash initialized with built-in default settings followed by 
-the contents of the hash C<<%{__PACKAGE__->config()}>>.  You can
-configure TT more to your needs by adding a C<new> method to the 
-generated TT component:
+=item *
 
-    sub new {
-      my $self = shift;
-      $self->config->{PRE_PROCESS} = 'config/main';
-      $self->config->{WRAPPER}     = 'site/wrapper';
-      return $self->SUPER::new(@_);
-    }
+Add Method to Process Form Values and Update Database
 
+=item *
 
+Test Out The Form
 
-=head1 AUTHOR
+=back
 
-Andrew Ford, C<A.Ford@ford-mason.co.uk>
-Marcus Ramberg, C<mramberg@cpan.org>
+=item *
 
-As noted above, this document is at an alpha stage.  My plan for this 
-document is as follows:
+A SIMPLE DELETE FEATURE
 
 =over 4
 
-=item 1
+=item *
+
+Include a Delete Link in the List
 
-expand this document fairly rapidly to cover topics relevant to
-a newcomer to Catalyst in an order that can be read sequentially
+=item *
 
-=item 2
+Add a Delete Action to the Controller
 
-incorporate feedback 
+=item *
 
-=item 3
+Try the Delete Feature
 
-revise the text 
+=back
 
 =back
 
-Placeholders are indicated by the words: TODO or CHECK 
 
-Please send comments, corrections and suggestions for improvements to
-A.Ford@ford-mason.co.uk
+=head2 Part 4: Authentication
+
+=over 4
+
+=item *
+
+BASIC AUTHENTICATION
+
+=over 4
+
+=item *
+
+Add Users and Roles to the Database
+
+=item *
+
+Add User and Role Information to DBIC Schema
+
+=item *
+
+Create New ``Result Source Objects''
+
+=item *
+
+Sanity-Check Reload of Development Server
+
+=item *
+
+Include Authentication and Session Plugins
+
+=item *
+
+Configure Authentication
+
+=item *
+
+Add Login and Logout Controllers
+
+=item *
+
+Add a Login Form TT Template Page
+
+=item *
+
+Add Valid User Check
+
+=item *
+
+Displaying Content Only to Authenticated Users
+
+=item *
+
+Try Out Authentication
+
+=back
+
+=item *
+
+USING PASSWORD HASHES
+
+=over 4
+
+=item *
+
+Get a SHA-1 Hash for the Password
+
+=item *
+
+Switch to SHA-1 Password Hashes in the Database
+
+=item *
+
+Enable SHA-1 Hash Passwords in Catalyst::Plugin::Authentication::Store::DBIC
+
+=item *
+
+Try Out the Hashed Passwords
+
+=back
+
+=back
+
+
+=head2 Part 5: Authorization
+
+=over 4
+
+=item *
+
+BASIC AUTHORIZATION
+
+=over 4
+
+=item *
+
+Update Plugins to Include Support  for Authorization
+
+=item *
+
+Add Config Information for Authorization
+
+=item *
+
+Add Role-Specific Logic to the ``Book List'' Template
+
+=item *
+
+Limit Books::add to admin Users
+
+=item *
+
+Try Out Authentication And Authorization
+
+=back
 
+=item *
 
-=head1 COPYRIGHT
+ENABLE ACL-BASED AUTHORIZATION
+
+=over 4
+
+=item *
+
+Add the Catalyst::Plugin::Authorization::ACL Plugin
+
+=item *
+
+Add ACL Rules to the Application Class
+
+=item *
+
+Add a Method to Handle Access Violations
+
+=back
+
+=back
+
+
+=head2 Part 6: Debugging
+
+=over 4
+
+=item *
+
+LOG STATEMENTS
+
+=item *
+
+RUNNING CATALYST UNDER THE PERL DEBUGGER
+
+=back
+
+
+=head2 Part 7: Testing
+
+=over 4
+
+=item *
+
+RUNNING THE "CANNED" CATALYST TESTS
+
+=item *
+
+RUNNING A SINGLE TEST
+
+=item *
+
+ADDING YOUR OWN TEST SCRIPT
+
+=item *
+
+SUPPORTING BOTH PRODUCTION AND TEST DATABASES
+
+=back
+
+
+=head2 Part 8: Advanced CRUD
+
+=over 4
+
+=item *
+
+HTML::WIDGET FORM CREATION
+
+=over 4
+
+=item *
+
+Add the HTML::Widget Plugin
+
+=item *
+
+Add a Form Creation Helper Method
+
+=item *
+
+Add Actions to Display and Save the Form
+
+=item *
+
+Update the CSS
+
+=item *
+
+Create a Template Page To Display The Form
+
+=item *
+
+Add Links for Create and Update via HTML::Widget
+
+=item *
+
+Test The <HTML::Widget> Create Form
+
+=back
+
+=item *
+
+HTML::WIDGET VALIDATION AND FILTERING
+
+=over 4
+
+=item *
+
+Add Constraints and Filters to the Widget Creation Method
+
+=item *
+
+Rebuild the Form Submission Method to Include Validation
+
+=item *
+
+Try Out the Form
+
+=back
+
+=item *
+
+Enable DBIx::Class::HTMLWidget Support
+
+=over 4
+
+=item *
+
+Add DBIx::Class::HTMLWidget to DBIC Model
+
+=item *
+
+Use populate_from_widget in hw_create_do
+
+=back
+
+=back
+
+
+=head2 Part 9: Appendices
+
+=over 4
+
+=item *
+
+APPENDIX 1: CUT AND PASTE FOR POD-BASED EXAMPLES
+
+=over 4
+
+=item *
+
+"Un-indenting" with Vi/Vim
+
+=item *
+
+"Un-indenting" with Emacs
+
+=back
+
+=item *
+
+APPENDIX 2: USING MYSQL AND POSTGRESQL
+
+=over 4
+
+=item *
+
+MySQL
+
+=item *
+
+PostgreSQL
+
+=back
+
+=back
 
-This program is free software, you can redistribute it and/or modify 
-it under the same terms as Perl itself.