X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Manual.git;a=blobdiff_plain;f=lib%2FCatalyst%2FManual%2FTutorial%2FMoreCatalystBasics.pod;h=7059c0d6f82a528111dffec4bf2637f6726ca0a9;hp=b6d944d5690c841b1460cbe40df5ec95db78bdfd;hb=72609296f6f6f655484b1700eebaf348af82bdde;hpb=0416017e10f523ec522ef48e0acef28217b57b55 diff --git a/lib/Catalyst/Manual/Tutorial/MoreCatalystBasics.pod b/lib/Catalyst/Manual/Tutorial/MoreCatalystBasics.pod index b6d944d..7059c0d 100644 --- a/lib/Catalyst/Manual/Tutorial/MoreCatalystBasics.pod +++ b/lib/Catalyst/Manual/Tutorial/MoreCatalystBasics.pod @@ -1,11 +1,11 @@ =head1 NAME -Catalyst::Manual::Tutorial::MoreCatalystBasics - Catalyst Tutorial - Part 3: More Catalyst Application Development Basics +Catalyst::Manual::Tutorial::MoreCatalystBasics - Catalyst Tutorial - Chapter 3: More Catalyst Application Development Basics =head1 OVERVIEW -This is B for the Catalyst tutorial. +This is B for the Catalyst tutorial. L @@ -56,26 +56,33 @@ L =head1 DESCRIPTION -This part of the tutorial builds on the work done in Part 2 to explore -some features that are more typical of "real world" web applications. -From this part of the tutorial onward, we will be building a simple -book database application. Although the application will be too -limited to be of use to anyone, it should provide a basic environment -where we can explore a variety of features used in virtually all web -applications. +This chapter of the tutorial builds on the work done in Chapter 2 to +explore some features that are more typical of "real world" web +applications. From this chapter of the tutorial onward, we will be +building a simple book database application. Although the application +will be too limited to be of use to anyone, it should provide a basic +environment where we can explore a variety of features used in +virtually all web applications. You can checkout the source code for this example from the catalyst subversion repository as per the instructions in L. +Please take a look at +L before +doing the rest of this tutorial. Although the tutorial should work +correctly under most any recent version of Perl running on any +operating system, the tutorial has been written using Debian 5 and +tested to be sure it runs correctly in this environment. + =head1 CREATE A NEW APPLICATION The remainder of the tutorial will build an application called C. First use the Catalyst C script to initialize the framework for the C application (make sure you aren't still inside the -directory of the C application from the previous part of the -tutorial): +directory of the C application from the previous chapter of the +tutorial or in a directory that already has a "MyApp" subdirectory): $ catalyst.pl MyApp created "MyApp" @@ -86,7 +93,7 @@ tutorial): created "MyApp/script/myapp_create.pl" $ cd MyApp -This creates a similar skeletal structure to what we saw in Part 2 of +This creates a similar skeletal structure to what we saw in Chapter 2 of the tutorial, except with C and C substituted for C and C. @@ -138,22 +145,23 @@ L file (versus having the values hard-coded inside your Perl modules). Config::General uses syntax very similar to Apache configuration files. We will see how to use this feature of Catalyst during the authentication and authorization -sections (Part 5 and Part 6). - -B If you are using a version of -L prior to version 1.06, you need to -be aware that Catalyst changed from a default format of YAML to the -more straightforward C format. This tutorial use the -newer C configuration file for C instead -of C for YAML. However, Catalyst has long supported both -formats and Catalyst will automatically use either C or -C (or any other format supported by -L and -L). If you are using a versions of -Catalyst::Devel prior to 1.06, you can convert to the newer format by -simply creating the C file manually and deleting -C. The default contents of C should only -consist of one line: C. +sections (Chapter 5 and Chapter 6). + +B If you are using a version of +L prior to version 1.06, be aware +that Catalyst changed the default format from YAML to the more +straightforward C style. This tutorial uses the +newer C file for C. However, Catalyst +supports both formats and will automatically use either C +or C (or any other format supported by +L and +L). If you are using a version of +Catalyst::Devel prior to 1.06, you can convert to the newer format by +simply creating the C file manually and deleting +C. The default contents of the C you create +should only consist of one line: + + name MyApp B: This script can be useful for converting between configuration formats: @@ -161,10 +169,6 @@ formats: perl -Ilib -e 'use MyApp; use Config::General; Config::General->new->save_file("myapp.conf", MyApp->config);' -B The default C should look like: - - name MyApp - =item * L @@ -176,31 +180,27 @@ as images and CSS files under the development server. For our application, we want to add one new plugin into the mix. To do this, edit C (this file is generally referred to as -your I) and delete the line with: +your I) and delete the lines with: - __PACKAGE__->setup(qw/-Debug ConfigLoader Static::Simple/); + use Catalyst qw/-Debug + ConfigLoader + Static::Simple/; Then replace it with: - __PACKAGE__->setup(qw/ - -Debug - ConfigLoader - Static::Simple - - StackTrace - /); + # Load plugins + use Catalyst qw/-Debug + ConfigLoader + Static::Simple + + StackTrace + /; B Recent versions of C have used a variety of -techniques to load these plugins/flags. If you are following along in -Ubuntu 8.10, you should have C v1.07 and see the -default code shown above. If you are using v1.08, you should see the -following by default: +techniques to load these plugins/flags. For example, you might see +the following: - use Catalyst qw/-Debug - ConfigLoader - Static::Simple/; - ... - __PACKAGE__->setup(); + __PACKAGE__->setup(qw/-Debug ConfigLoader Static::Simple/); Don't let these variations confuse you -- they all accomplish the same result. @@ -254,7 +254,7 @@ actions: created "/home/me/MyApp/script/../lib/MyApp/Controller/Books.pm" created "/home/me/MyApp/script/../t/controller_Books.t" -Then edit C (as discussed in Part 2 of +Then edit C (as discussed in Chapter 2 of the Tutorial, Catalyst has a separate directory under C for each of the three parts of MVC: C, C, and C) and add the following method to the controller: @@ -294,43 +294,31 @@ Context object is automatically passed to all Catalyst components. It is used to pass information between components and provide access to Catalyst and plugin functionality. -Catalyst actions are regular Perl methods, but they make use -of attributes (the "C<: Local>" next to the "C" in the code +Catalyst actions are regular Perl methods, but they make use of +attributes (the "C<: Local>" next to the "C" in the code above) to provide additional information to the Catalyst dispatcher logic (note that the space between the colon and the attribute name is -optional... you will see them written both ways). Over time, the -recommended style for most Catalyst applications has changed: - -=over 4 - -=item * From "C<:Local>" and "C<:Private>" - -=item * To "C<:Path>" and "C<:Args>" - -=item * To "C<:Chained>" - -=back - -Although all three styles work just fine, the newer forms offer more -advanced capbilities and allow you to be more expressive with the URIs -that your application uses. - -Here is a quick summary of the most commonly used action types: -C, C, C and C: +optional... you will see attributes written both ways). Most Catalyst +Controllers use one of five action types: =over 4 =item * -B -- In the past, the majority of applications have -traditionally used C actions for items that respond to user -requests and C actions for those that do not directly respond -to user input. +B<:Private> -- Use C<:Private> for methods that you want to make into +an action, but you do not want Catalyst to directly expose the action +to your users. Catalyst will not map C<:Private> methods to a URI. +Use them for various sorts of "special" methods (the C, +C, etc. discussed below) or for methods you want to be able to +C or C to. (If the method is a plain old "helper +method" that you don't want to be an action at all, then just define +the method without any attribute -- you can call it in your code, but +the Catalyst dispatcher will ignore it.) -=over 4 +There are five types of "special" build-in C<:Private> actions: +C, C, C, C, and C. -There are five types of build-in C actions: C, -C, C, C, and C. +=over 4 =item * @@ -351,20 +339,32 @@ controller down through the most specific class>. =item * -B -- C actions were the next style of action types to -become popular and essentially provide a limited subset of what can be -found done with Chained actions. You can match on different portions -of the URI (for example C in +B<:Path> -- C<:Path> actions let you map a method to an explicit URI +path. For example, "C<:Path('list')>" in C would match on the URL -C but C would match -on C) and it let's you be very specific with -what arguments each controller method will accept. See -L for more information and a few +C but "C<:Path('/list')>" would match +on C. You can use C<:Args()> to specify +how many arguments an action should except. See +L for more information and a few examples. =item * -B -- Newer Catalyst applications tend to use the Chained +B<:Local> -- C<:Local> is merely a shorthand for +"C<:Path('_name_of_method_')>". For example, these are equivalent: +"C" and +"C". + +=item * + +B<:Global> -- C<:Global> is merely a shorthand for +"C<:Path('/_name_of_method_')>". For example, these are equivalent: +"C" and +"C". + +=item * + +B<:Chained> -- Newer Catalyst applications tend to use the Chained dispatch form of action types because of its power and flexibility. It allows a series of controller methods to automatically be dispatched to service a single user request. See @@ -376,12 +376,12 @@ for more information on chained actions. You should refer to L for additional information and for coverage of some lesser-used action -types not discussed here (C, C and C). +types not discussed here (C and C). =head1 CATALYST VIEWS -As mentioned in Part 2 of the tutorial, views are where you render +As mentioned in Chapter 2 of the tutorial, views are where you render output, typically for display in the user's web browser (but also possibly using other display output-generation systems). The code in C selects the I of view to use, with the actual @@ -414,7 +414,7 @@ L Both helpers are similar. C creates the C file and leaves the creation of any hierarchical template organization entirely up to you. (It also creates a C file for testing; -test cases will be discussed in Part 8.) C, on the other hand, +test cases will be discussed in Chapter 8.) C, on the other hand, creates a modular and hierarchical view layout with separate Template Toolkit (TT) files for common header and footer information, configuration values, a CSS stylesheet, and more. @@ -469,6 +469,12 @@ C to C. These changes from the default are done mostly to facilitate the application we're developing in this tutorial; as with most things Perl, there's more than one way to do it... +B We will use C as the base directory for our +template files, which a full naming convention of +C. Another popular option is to +use C as the base (with a full filename pattern of +C). + =head2 Create a TT Template Page @@ -606,7 +612,7 @@ can use the SQLite command line environment to do a quick dump of the database contents: $ sqlite3 myapp.db - SQLite version 3.4.2 + SQLite version 3.5.9 Enter ".help" for instructions sqlite> select * from books; 1|CCSP SNRS Exam Certification Guide|5 @@ -635,7 +641,8 @@ your OS command prompt. For using other databases, such as PostgreSQL or MySQL, see L. -=head1 DATABASE ACCESS WITH C + +=head1 DATABASE ACCESS WITH DBIx::Class Catalyst can be used with virtually any form of persistent datastore available via Perl. For example, @@ -655,7 +662,8 @@ Use the C model helper option to build a model that dynamically reads your database structure every time the application starts: - $ script/myapp_create.pl model DB DBIC::Schema MyApp::Schema create=dynamic dbi:SQLite:myapp.db + $ script/myapp_create.pl model DB DBIC::Schema MyApp::Schema \ + create=dynamic dbi:SQLite:myapp.db exists "/home/me/MyApp/script/../lib/MyApp/Model" exists "/home/me/MyApp/script/../t" exists "/home/me/MyApp/script/../lib/MyApp" @@ -664,19 +672,37 @@ starts: created "/home/me/MyApp/script/../t/model_DB.t" +The C