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/lib/My/App/V"
created "My-App/lib/My/App/C"
created "My-App/lib/My/App.pm"
+ created "My-App/Build.PL"
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"
+ created "My-App/t/02pod.t"
+ created "My-App/t/03podcoverage.t"
+ created "My-App/script/my_app_cgi.pl"
+ created "My-App/script/my_app_fastcgi.pl"
+ created "My-App/script/my_app_server.pl"
+ created "My-App/script/my_app_test.pl"
+ created "My-App/script/my_app_create.pl"
This creates the directory structure shown, populated with skeleton
files.
=head2 Testing out the sample application
You can test out your new application by running the server script that
-catalyst provides:
+Catalyst provides:
$ cd My-App
- $ script/server.pl
+ $ script/my_app_server.pl
+
[...] [catalyst] [debug] Debug messages enabled
+ [...] [catalyst] [debug] Loaded dispatcher "Catalyst::Dispatcher"
[...] [catalyst] [debug] Loaded engine "Catalyst::Engine::HTTP"
+ [...] [catalyst] [debug] Found home "/usr/home/jester/foo/My-App/script/.."
[...] [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
-
-(Note that each line logged by Catalyst includes a timestamp, which has
+ .=--------------------------------+------------------------------------=.
+ | Private | Class |
+ |=--------------------------------+------------------------------------=|
+ | /default | My::App |
+ '=--------------------------------+------------------------------------='
+
+ [....] [catalyst] [info] My::App powered by Catalyst 5.20
+ You can connect to your server at http://localhost:3000/
+
+(Note that each line logged by Catalyst begins with a timestamp, which has
been replaced here with "C<...>" so that the text fits onto the lines.)
The server is now waiting for you to make requests of it. Try using
GET / HTTP/1.0
HTTP/1.0 200
- Server: Catalyst/5.00
+ Server: Catalyst/5.20
Status: 200
- Date: Sun, 20 Mar 2005 12:31:55 GMT
- X-catalyst: 5.00
+ Date: Fri May 13 14:15:46 EDT 2005
+ X-catalyst: 5.20
Content-length: 40
Content-Type: text/html; charset=ISO-8859-1
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>.
+helper script, C<script/my_app_test.pl>.
=head2 Getting your application invoked
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.
+documents, images, and templates can be found.
Catalyst associates I<actions> with URLs and on receiving a request
dispatches to the action that matches to request URL. The call to
As you see, the default action is defined as a Private action.
Most private actions are not directly available from a web url. This
-also includes the built-in actions, 'default','begin','end' and
+also includes the built-in actions, 'default','begin','end', and
'auto', although they will be called as part of some chains.
The rest can only be reached by using C<forward>.
-
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.
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:
+followed by C<M>, C<V> or C<C> (or the optional long
+forms: C<Model>, C<View> or C<Controller>) followed by the component
+name, for example:
+ My::App::C::ShoppingCart # short (default) version
My::App::Controller::ShoppingCart # long version
- My::App::C::ShoppingCart # short version
-
+ My::App::M::User # short (default) version
+ My::App::Model::User # long version
=head2 Extending the generated code
$c->res->output('Congratulations, My::App is on Catalyst!');
}
+ # called like '/article/2005/06'
+ sub archive_month : Regex('^article/(\d{4})/(\d{2})$') {
+ my ( $self, $c ) = @_;
+
+ my $datetime = DateTime->new(
+ year => $c->request->snippets->[0],
+ month => $c->request->snippets->[1]
+ );
+ }
-TODO: explain briefly about plugins, actions and components
+TODO: explain briefly about plugins, actions, and components
-regex actions passed subexpression matches in $c->req->snippets
-(array ref).
+If the action is a Regex type, you can use capturing parentheses to
+extract values within the matching URL (2005, 06 in the above
+example). Those values are available in the $c->req->snippets
+anonymous array. See L<Catalyst::Manual::Intro#Actions> for details.
=head2 Hooking in to Template Toolkit
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).
+Chamberlain, Dave Cross, and Andy Wardley, O'Reilly & Associates, 2004).
You can create a stub Template Toolkit view component using the create
script that Catalyst set up as part of the skeleton application:
=item 1
-expand this document fairly rapidly to cover topics relevant to
-a newcomer to Catalyst in an order that can be read sequentially
+Expand this document fairly rapidly to cover topics relevant to
+a newcomer to Catalyst, in an order that can be read sequentially
=item 2
-incorporate feedback
+Incorporate feedback
=item 3
-revise the text
+Revise the text
=back