Updated Intro.pod
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Manual / Intro.pod
CommitLineData
fc7ec1d9 1=head1 NAME
2
3Catalyst::Manual::Intro - Introduction to Catalyst
4
5=head1 DESCRIPTION
6
129cfe74 7This is a brief overview of why and how to use Catalyst. It explains how
8Catalyst works and shows how to get a simple application up and running quickly.
fc7ec1d9 9
10=head2 What is Catalyst?
11
129cfe74 12Catalyst is an elegant web application framework, extremely flexible yet
13extremely simple. It's similar to Ruby on Rails, Spring (Java) and L<Maypole>,
14upon which it was originally based.
fc7ec1d9 15
16=head3 MVC
17
129cfe74 18Catalyst follows the Model-View-Controller (MVC) design pattern, allowing you to
19easily separate concerns, like content, presentation, and flow control, into
20separate modules. This separation allows you to modify code that handles one
21concern without affecting code that handles the others. Catalyst promotes the
22re-use of existing Perl modules that already handle common web application
23concerns well.
fc7ec1d9 24
129cfe74 25Here's how the M, V, and C map to those concerns, with examples of well-known
26Perl modules you may want to use for each.
fc7ec1d9 27
28=over 4
29
4a6895ce 30=item * B<Model>
fc7ec1d9 31
32Access and modify content (data). L<Class::DBI>, L<Plucene>, L<Net::LDAP>...
33
4a6895ce 34=item * B<View>
fc7ec1d9 35
129cfe74 36Present content to the user. L<Template Toolkit|Template>, L<Mason|HTML::Mason>,
37L<HTML::Template>...
fc7ec1d9 38
4a6895ce 39=item * B<Controller>
fc7ec1d9 40
129cfe74 41Control the whole request phase, check parameters, dispatch actions, flow
42control. Catalyst!
fc7ec1d9 43
44=back
45
26e73131 46If you're unfamiliar with MVC and design patterns, you may want to check
47out the original book on the subject, I<Design Patterns>, by Gamma,
48Helm, Johnson, and Vlissides, also known as the Gang of Four (GoF). You
49can also just Google it. Many, many web application frameworks are
50based on MVC, including all those listed above.
fc7ec1d9 51
52=head3 Flexibility
53
129cfe74 54Catalyst is much more flexible than many other frameworks. We'll talk more about
55this later, but rest assured you can use your favorite Perl modules with
56Catalyst.
fc7ec1d9 57
58=over 4
59
72d9bfc7 60=item * B<Multiple Models, Views, and Controllers>
fc7ec1d9 61
129cfe74 62To build a Catalyst application, you handle each type of concern inside special
63modules called L</Components>. Often this code will be very simple, just calling
64out to Perl modules like those listed above under L</MVC>. Catalyst handles
65these components in a very flexible way. Use as many Models, Views, and
66Controllers as you like, using as many different Perl modules as you like, all
67in the same application. Want to manipulate multiple databases, and retrieve
68some data via LDAP? No problem. Want to present data from the same Model using
69L<Template Toolkit|Template> and L<PDF::Template>? Easy.
fc7ec1d9 70
cda8d1ac 71=item * B<Reuseable Components>
fc7ec1d9 72
129cfe74 73Not only does Catalyst promote the re-use of already existing Perl modules, it
74also allows you to re-use your Catalyst components in multiple Catalyst
75applications.
fc7ec1d9 76
4a6895ce 77=item * B<Unrestrained URL-to-Action Dispatching>
fc7ec1d9 78
129cfe74 79Catalyst allows you to dispatch any URLs to any application L<Actions>, even
80through regular expressions! Unlike most other frameworks, it doesn't require
81mod_rewrite or class and method names in URLs.
fc7ec1d9 82
83With Catalyst you register your actions and address them directly. For example:
84
e3dc9d78 85 sub hello : Global {
fc7ec1d9 86 my ( $self, $context ) = @_;
66f6e959 87 $context->response->body('Hello World!');
5a8ed4fe 88 }
fc7ec1d9 89
90Now http://localhost:3000/hello prints "Hello World!".
91
4a6895ce 92=item * B<Support for CGI, mod_perl, Apache::Request>
fc7ec1d9 93
94Use L<Catalyst::Engine::Apache> or L<Catalyst::Engine::CGI>.
95
96=back
97
98=head3 Simplicity
99
129cfe74 100The best part is that Catalyst implements all this flexibility in a very simple
101way.
fc7ec1d9 102
6f4e1683 103=over 4
104
4a6895ce 105=item * B<Building Block Interface>
fc7ec1d9 106
129cfe74 107Components interoperate very smoothly. For example, Catalyst automatically makes
108a L<Context> object available to every component. Via the context, you can
109access the request object, share data between components, and control the flow
110of your application. Building a Catalyst application feels a lot like snapping
111together toy building blocks, and everything just works.
fc7ec1d9 112
4a6895ce 113=item * B<Component Auto-Discovery>
fc7ec1d9 114
129cfe74 115No need to C<use> all of your components. Catalyst automatically finds and loads
116them.
fc7ec1d9 117
4a6895ce 118=item * B<Pre-Built Components for Popular Modules>
fc7ec1d9 119
129cfe74 120See L<Catalyst::Model::CDBI> for L<Class::DBI>, or L<Catalyst::View::TT> for
121L<Template Toolkit|Template>. You can even get an instant web database front end
122with L<Catalyst::Model::CDBI::CRUD>.
fc7ec1d9 123
72d9bfc7 124=item * B<Built-in Test Framework>
fc7ec1d9 125
129cfe74 126Catalyst comes with a built-in, lightweight http server and test framework,
127making it easy to test applications from the command line.
fc7ec1d9 128
4a6895ce 129=item * B<Helper Scripts>
fc7ec1d9 130
129cfe74 131Catalyst provides helper scripts to quickly generate running starter code for
132components and unit tests.
fc7ec1d9 133
6f4e1683 134=back
135
fc7ec1d9 136=head2 Quickstart
137
129cfe74 138Here's how to install Catalyst and get a simple application up and running,
139using the helper scripts described above.
fc7ec1d9 140
141=head3 Install
142
143 $ perl -MCPAN -e 'install Bundle::Catalyst'
144
145=head3 Setup
146
2feb6632 147 $ catalyst.pl MyApp
b33ed88c 148 # output omitted
2feb6632 149 $ cd MyApp
ac4a0ae0 150 $ script/myapp_create.pl controller Library::Login
fc7ec1d9 151
152=head3 Run
153
b33ed88c 154 $ script/myapp_server.pl
fc7ec1d9 155
129cfe74 156Now visit these locations with your favorite browser or user agent to see
157Catalyst in action:
fc7ec1d9 158
159=over 4
160
161=item http://localhost:3000/
162
ac4a0ae0 163=item http://localhost:3000/library/login/
fc7ec1d9 164
165=back
166
167Dead easy!
168
169=head2 How It Works
170
129cfe74 171Let's see how Catalyst works, by taking a closer look at the components and
172other parts of a Catalyst application.
fc7ec1d9 173
174=head3 Application Class
175
129cfe74 176In addition to the Model, View, and Controller components, there's a single
177class that represents your application itself. This is where you configure your
178application, load plugins, define application-wide actions, and extend Catalyst.
fc7ec1d9 179
180 package MyApp;
181
182 use strict;
183 use Catalyst qw/-Debug/;
184
185 MyApp->config(
186 name => 'My Application',
fc7ec1d9 187
b33ed88c 188 # You can put anything else you want in here:
189 my_configuration_variable => 'something',
fc7ec1d9 190 );
191
5a8ed4fe 192 sub default : Private {
fc7ec1d9 193 my ( $self, $context ) = @_;
66f6e959 194 $context->response->body('Catalyst rockz!');
5a8ed4fe 195 }
fc7ec1d9 196
197 1;
198
66f6e959 199For most applications, Catalyst requires you to define only one config
200parameter:
fc7ec1d9 201
202=over 4
203
4a6895ce 204=item * B<name>
fc7ec1d9 205
206Name of your application.
207
fc7ec1d9 208=back
209
66f6e959 210Optionally, you can specify a B<root> parameter for templates and static data.
211If omitted, Catalyst will try to auto-detect the directory's location. You
212can define as many parameters as you want for plugins or whatever you
213need. You can access them anywhere in your application
214via C<$context-E<gt>config-E<gt>{$param_name}>.
fc7ec1d9 215
216=head3 Context
217
129cfe74 218Catalyst automatically blesses a Context object into your application class and
219makes it available everywhere in your application. Use the Context to directly
220interact with Catalyst and glue your L<Components> together. For example, if you
221need to use the Context from within a Template Toolkit template, it's already
222there:
c42f5bbf 223
224 <h1>Welcome to [% c.config.name %]!</h1>
fc7ec1d9 225
129cfe74 226As illustrated earlier in our URL-to-Action dispatching example, the Context is
227always the second method parameter, behind the Component object reference or
228class name itself. Previously we called it C<$context> for clarity, but most
229Catalyst developers just call it C<$c>:
fc7ec1d9 230
e3dc9d78 231 sub hello : Global {
fc7ec1d9 232 my ( $self, $c ) = @_;
66f6e959 233 $c->res->body('Hello World!');
5a8ed4fe 234 }
fc7ec1d9 235
236The Context contains several important objects:
237
238=over 4
239
240=item * L<Catalyst::Request>
241
242 $c->request
243 $c->req # alias
244
129cfe74 245The request object contains all kinds of request-specific information, like
246query parameters, cookies, uploads, headers, and more.
fc7ec1d9 247
248 $c->req->params->{foo};
249 $c->req->cookies->{sessionid};
250 $c->req->headers->content_type;
251 $c->req->base;
252
afdca3a3 253=item * L<Catalyst::Response>
fc7ec1d9 254
255 $c->response
256 $c->res # alias
257
129cfe74 258The response is like the request, but contains just response-specific
259information.
fc7ec1d9 260
66f6e959 261 $c->res->body('Hello World');
fc7ec1d9 262 $c->res->status(404);
263 $c->res->redirect('http://oook.de');
264
265=item * L<Catalyst::Config>
266
267 $c->config
268
269 $c->config->root;
270 $c->config->name;
271
272=item * L<Catalyst::Log>
273
274 $c->log
275
276 $c->log->debug('Something happened');
277 $c->log->info('Something you should know');
278
4a6895ce 279=item * B<Stash>
fc7ec1d9 280
281 $c->stash
282
283 $c->stash->{foo} = 'bar';
284
285=back
286
129cfe74 287The last of these, the stash, is a universal hash for sharing data among
288application components. For an example, we return to our 'hello' action:
fc7ec1d9 289
e3dc9d78 290 sub hello : Global {
5a8ed4fe 291 my ( $self, $c ) = @_;
292 $c->stash->{message} = 'Hello World!';
4c6807d2 293 $c->forward('show_message');
5a8ed4fe 294 }
fc7ec1d9 295
4c6807d2 296 sub show_message : Private {
5a8ed4fe 297 my ( $self, $c ) = @_;
66f6e959 298 $c->res->body( $c->stash->{message} );
5a8ed4fe 299 }
fc7ec1d9 300
129cfe74 301Note that the stash should be used only for passing data in an individual
302request cycle; it gets cleared at a new request. If you need to maintain more
303persistent data, use a session.
dd25a192 304
fc7ec1d9 305=head3 Actions
306
129cfe74 307A Catalyst controller is defined by its actions. An action is a sub with a
308special attribute. You've already seen some examples of actions in this
309document. The URL (for example http://localhost.3000/foo/bar) consists of two
310parts, the base (http://localhost:3000/ in this example) and the path (foo/bar).
311Please note that the trailing slash after the hostname[:port] always belongs to
312base and not to the action.
cda8d1ac 313
314Catalyst supports several types of actions:
fc7ec1d9 315
316=over 4
317
4a6895ce 318=item * B<Literal>
fc7ec1d9 319
0cf56dbc 320 package MyApp::C::My::Controller;
f29c48dd 321 sub bar : Path('foo/bar') { }
fc7ec1d9 322
0cf56dbc 323Literal C<Path> actions will act relative to their current namespace. The above
324example matches only http://localhost:3000/my/controller/foo/bar. If you start
325your path with a forward slash, it will match from the root. Example:
326
327 package MyApp::C::My::Controller;
328 sub bar : Path('/foo/bar') { }
329
fc7ec1d9 330Matches only http://localhost:3000/foo/bar.
331
0cf56dbc 332 package MyApp::C::My::Controller;
333 sub bar : Path { }
334
335By leaving the C<Path> definition empty, it will match on the namespace root.
336The above code matches http://localhost:3000/my/controller.
337
4a6895ce 338=item * B<Regex>
fc7ec1d9 339
b33ed88c 340 sub bar : Regex('^item(\d+)/order(\d+)$') { }
fc7ec1d9 341
129cfe74 342Matches any URL that matches the pattern in the action key, e.g.
343http://localhost:3000/item23/order42. The '' around the regexp is optional, but
344perltidy likes it. :)
b33ed88c 345
129cfe74 346Regex matches act globally, i.e. without reference to the namespace from which
347it is called, so that a C<bar> method in the
348C<MyApp::Controller::Catalog::Order::Process> namespace won't match any form of
349C<bar>, C<Catalog>, C<Order>, or C<Process> unless you explicitly put this in
66f6e959 350the regex. To achieve the above, you should consider using a C<LocalRegex> action.
351
352=item * B<LocalRegex>
353
354 sub bar : LocalRegex('^widget(\d+)$') { }
fc7ec1d9 355
66f6e959 356LocalRegex actions act locally. If you were to use C<bar> in
0cf56dbc 357C<MyApp::Controller::Catalog>, the above example would match urls like
358http://localhost:3000/catalog/widget23.
359
360If you omit the "C<^>" from your regex, then it will match any depth from the
361controller and not immediately off of the controller name. The following example
362differes from the above code in that it will match
363http://localhost:3000/catalog/foo/widget23 as well.
364
365 package MyApp::Controller::Catalog;
366 sub bar : LocalRegex('widget(\d+)$') { }
66f6e959 367
368For both LocalRegex and Regex actions, if you use capturing parentheses to
369extract values within the matching URL ("widget23" would capture "23" in the
370above example), those values are available in the $c->req->snippets
129cfe74 371array. If you want to pass arguments at the end of your URL, you must use regex
372action keys. See L</URL Argument Handling> below.
fc7ec1d9 373
72d9bfc7 374=item * B<Top-level>
cda8d1ac 375
376 package MyApp;
377 sub foo : Global { }
378
b33ed88c 379Matches http://localhost:3000/foo. The function name is mapped directly
380to the application base.
cda8d1ac 381
4a6895ce 382=item * B<Namespace-Prefixed>
fc7ec1d9 383
2feb6632 384 package MyApp::C::My::Controller;
e3dc9d78 385 sub foo : Local { }
fc7ec1d9 386
cda8d1ac 387Matches http://localhost:3000/my/controller/foo.
fc7ec1d9 388
129cfe74 389This action type indicates that the matching URL must be prefixed with a
390modified form of the component's class (package) name. This modified class name
391excludes the parts that have a pre-defined meaning in Catalyst ("MyApp::C" in
392the above example), replaces "::" with "/", and converts the name to lower case.
393See L</Components> for a full explanation of the pre-defined meaning of Catalyst
394component class names.
fc7ec1d9 395
4a6895ce 396=item * B<Private>
fc7ec1d9 397
5a8ed4fe 398 sub foo : Private { }
fc7ec1d9 399
129cfe74 400Matches no URL, and cannot be executed by requesting a URL that corresponds to
401the action key. Private actions can be executed only inside a Catalyst
402application, by calling the C<forward> method:
fc7ec1d9 403
5a8ed4fe 404 $c->forward('foo');
fc7ec1d9 405
129cfe74 406See L</Flow Control> for a full explanation of C<forward>. Note that, as
fc9c8698 407discussed there, when forwarding from another component, you must use
408the absolute path to the method, so that a private C<bar> method in your
409C<MyApp::Controller::Catalog::Order::Process> controller must, if called
410from elsewhere, be reached with
411C<$c-E<gt>forward('/catalog/order/process/bar')>.
fc7ec1d9 412
413=back
414
b33ed88c 415B<Note:> After seeing these examples, you probably wonder what the point
416is of defining names for regex and path actions. Actually, every public
417action is also a private one, so you have one unified way of addressing
418components in your C<forward>s.
cda8d1ac 419
72d9bfc7 420=head4 Built-in Private Actions
fc7ec1d9 421
fc9c8698 422In response to specific application states, Catalyst will automatically
423call these built-in private actions in your application class:
fc7ec1d9 424
425=over 4
426
cda8d1ac 427=item * B<default : Private>
fc7ec1d9 428
fc9c8698 429Called when no other action matches. Could be used, for example, for
430displaying a generic frontpage for the main app, or an error page for
431individual controllers.
fc7ec1d9 432
0cf56dbc 433If C<default> isn't acting how you would expect, look at using a
434L<Literal> C<Path> action (with an empty path string). The difference
435being that C<Path> takes arguments relative from the namespace and
436C<default> takes arguments relative from the root.
437
66f6e959 438=item * B<index : Private>
439
440C<index> is much like C<default> except that it takes no arguments
441and it is weighted slightly higher in the matching process.
442
cda8d1ac 443=item * B<begin : Private>
fc7ec1d9 444
fc9c8698 445Called at the beginning of a request, before any matching actions are
446called.
fc7ec1d9 447
cda8d1ac 448=item * B<end : Private>
4a6895ce 449
fc7ec1d9 450Called at the end of a request, after all matching actions are called.
451
fc9c8698 452=back
453
6b10c72b 454=head4 Built-in actions in controllers/autochaining
fc7ec1d9 455
cda8d1ac 456 Package MyApp::C::Foo;
457 sub begin : Private { }
5a8ed4fe 458 sub default : Private { }
eff5f524 459 sub auto : Private { }
fc7ec1d9 460
fc9c8698 461You can define built-in private actions within your controllers as
462well. The actions will override the ones in less-specific controllers,
463or your application class. In other words, for each of the three
464built-in private actions, only one will be run in any request
465cycle. Thus, if C<MyApp::C::Catalog::begin> exists, it will be run in
466place of C<MyApp::begin> if you're in the C<catalog> namespace, and
467C<MyApp::C::Catalog::Order::begin> would override this in turn.
468
eff5f524 469In addition to the normal built-in actions, you have a special action
470for making chains, C<auto>. Such C<auto> actions will be run after any
fc9c8698 471C<begin>, but before your action is processed. Unlike the other
eff5f524 472built-ins, C<auto> actions I<do not> override each other; they will be
473called in turn, starting with the application class and going through to
474the I<most> specific class. I<This is the reverse of the order in which
475the normal built-ins override each other>.
fc9c8698 476
477Here are some examples of the order in which the various built-ins
478would be called:
cda8d1ac 479
480=over 4
481
fc9c8698 482=item for a request for C</foo/foo>
cda8d1ac 483
484 MyApp::begin
80ef2e6d 485 MyApp::auto
fc9c8698 486 MyApp::C::Foo::default # in the absence of MyApp::C::Foo::Foo
cda8d1ac 487 MyApp::end
488
fc9c8698 489=item for a request for C</foo/bar/foo>
cda8d1ac 490
cda8d1ac 491 MyApp::C::Foo::Bar::begin
80ef2e6d 492 MyApp::auto
493 MyApp::C::Foo::auto
fc9c8698 494 MyApp::C::Foo::Bar::auto
495 MyApp::C::Foo::Bar::default # for MyApp::C::Foo::Bar::foo
cda8d1ac 496 MyApp::C::Foo::Bar::end
80ef2e6d 497
498=back
499
fc9c8698 500The C<auto> action is also distinguished by the fact that you can break
501out of the processing chain by returning 0. If an C<auto> action returns
5020, any remaining actions will be skipped, except for C<end>. So, for the
503request above, if the first auto returns false, the chain would look
504like this:
80ef2e6d 505
506=over 4
507
fc9c8698 508=item for a request for C</foo/bar/foo> where first C<auto> returns
509false
80ef2e6d 510
511 MyApp::C::Foo::Bar::begin
512 MyApp::auto
513 MyApp::C::Foo::Bar::end
cda8d1ac 514
515=back
4a6895ce 516
fc9c8698 517An example of why one might use this is an authentication action: you
518could set up a C<auto> action to handle authentication in your
519application class (which will always be called first), and if
520authentication fails, returning 0 would skip any remaining methods
521for that URL.
03805733 522
fc9c8698 523B<Note:> Looking at it another way, C<auto> actions have to return a
524true value to continue processing! You can also C<die> in the autochain
525action; in that case, the request will go straight to the finalize
526stage, without processing further actions.
03805733 527
6b10c72b 528=head4 URL Path Handling
4a6895ce 529
fc9c8698 530You can pass variable arguments as part of the URL path. In this case,
531you must use regex action keys with '^' and '$' anchors, and the
532arguments must be separated with forward slashes (/) in the URL. For
533example, suppose you want to handle C</foo/$bar/$baz>, where C<$bar> and
534C<$baz> may vary:
4a6895ce 535
cda8d1ac 536 sub foo : Regex('^foo$') { my ($self, $context, $bar, $baz) = @_; }
4a6895ce 537
fc9c8698 538But what if you also defined actions for C</foo/boo> and C</foo/boo/hoo>?
4a6895ce 539
f29c48dd 540 sub boo : Path('foo/boo') { .. }
541 sub hoo : Path('foo/boo/hoo') { .. }
4a6895ce 542
543Catalyst matches actions in most specific to least specific order:
544
545 /foo/boo/hoo
546 /foo/boo
fc9c8698 547 /foo # might be /foo/bar/baz but won't be /foo/boo/hoo
4a6895ce 548
fc9c8698 549So Catalyst would never mistakenly dispatch the first two URLs to the
550'^foo$' action.
fc7ec1d9 551
6b10c72b 552=head4 Parameter Processing
2ef2fb0f 553
fc9c8698 554Parameters passed in the URL query string are handled with methods in
555the L<Catalyst::Request> class. The C<param> method is functionally
556equivalent to the C<param> method of C<CGI.pm> and can be used in
557modules that require this.
2ef2fb0f 558
559 # http://localhost:3000/catalog/view/?category=hardware&page=3
560 my $category = $c->req->param('category');
561 my $current_page = $c->req->param('page') || 1;
562
563 # multiple values for single parameter name
564 my @values = $c->req->param('scrolling_list');
565
566 # DFV requires a CGI.pm-like input hash
567 my $results = Data::FormValidator->check($c->req->params, \%dfv_profile);
568
fc7ec1d9 569=head3 Flow Control
570
d08ced28 571You control the application flow with the C<forward> method, which
572accepts the key of an action to execute. This can be an action in the
573same or another Catalyst controller, or a Class name, optionally
574followed by a method name. After a C<forward>, the control flow will
575return to the method from which the C<forward> was issued.
576
577A C<forward> is similar to a method call. The main differences are that
578it wraps the call in an C<eval> to allow exception handling; it
579automatically passes along the context object (C<$c> or C<$context>);
580and it allows profiling of each call (displayed in the log with
581debugging enabled).
fc7ec1d9 582
e3dc9d78 583 sub hello : Global {
5a8ed4fe 584 my ( $self, $c ) = @_;
585 $c->stash->{message} = 'Hello World!';
d08ced28 586 $c->forward('check_message'); # $c is automatically included
5a8ed4fe 587 }
fc7ec1d9 588
4c6807d2 589 sub check_message : Private {
5a8ed4fe 590 my ( $self, $c ) = @_;
591 return unless $c->stash->{message};
4c6807d2 592 $c->forward('show_message');
5a8ed4fe 593 }
fc7ec1d9 594
4c6807d2 595 sub show_message : Private {
5a8ed4fe 596 my ( $self, $c ) = @_;
66f6e959 597 $c->res->body( $c->stash->{message} );
5a8ed4fe 598 }
3323f920 599
d08ced28 600A C<forward> does not create a new request, so your request
601object (C<$c-E<gt>req>) will remain unchanged. This is a
602key difference between using C<forward> and issuing a
603redirect.
3323f920 604
d08ced28 605You can pass new arguments to a C<forward> by adding them
606in an anonymous array. In this case C<$c-E<gt>req-E<gt>args>
607will be changed for the duration of the C<forward> only; upon
608return, the original value of C<$c-E<gt>req-E<gt>args> will
609be reset.
3323f920 610
611 sub hello : Global {
612 my ( $self, $c ) = @_;
613 $c->stash->{message} = 'Hello World!';
d08ced28 614 $c->forward('check_message',[qw/test1/]);
615 # now $c->req->args is back to what it was before
3323f920 616 }
617
d08ced28 618 sub check_message : Private {
619 my ( $self, $c ) = @_;
620 my $first_argument = $c->req->args[0]; # now = 'test1'
621 # do something...
622 }
cda8d1ac 623
d08ced28 624As you can see from these examples, you can just use the method name as
625long as you are referring to methods in the same controller. If you want
626to forward to a method in another controller, or the main application,
627you will have to refer to the method by absolute path.
cda8d1ac 628
629 $c->forward('/my/controller/action');
d08ced28 630 $c->forward('/default'); # calls default in main application
fc7ec1d9 631
d08ced28 632Here are some examples of how to forward to classes and methods.
fc7ec1d9 633
e3dc9d78 634 sub hello : Global {
5a8ed4fe 635 my ( $self, $c ) = @_;
636 $c->forward(qw/MyApp::M::Hello say_hello/);
637 }
fc7ec1d9 638
e3dc9d78 639 sub bye : Global {
5a8ed4fe 640 my ( $self, $c ) = @_;
d08ced28 641 $c->forward('MyApp::M::Hello'); # no method: will try 'process'
5a8ed4fe 642 }
fc7ec1d9 643
644 package MyApp::M::Hello;
645
646 sub say_hello {
647 my ( $self, $c ) = @_;
66f6e959 648 $c->res->body('Hello World!');
fc7ec1d9 649 }
650
651 sub process {
652 my ( $self, $c ) = @_;
66f6e959 653 $c->res->body('Goodbye World!');
fc7ec1d9 654 }
655
d08ced28 656Note that C<forward> returns to the calling action and continues
13436c14 657processing after the action finishes. If you want all further processing
658in the calling action to stop, use C<detach> instead, which will execute
659the C<detach>ed action and not return to the calling sub. In both cases,
660Catalyst will automatically try to call process() if you omit the
661method.
fc7ec1d9 662
663=head3 Components
664
129cfe74 665Catalyst has an uncommonly flexible component system. You can define as many
666L<Models>, L<Views>, and L<Controllers> as you like.
fc7ec1d9 667
129cfe74 668All components must inherit from L<Catalyst::Base>, which provides a simple
669class structure and some common class methods like C<config> and C<new>
670(constructor).
fc7ec1d9 671
ac4a0ae0 672 package MyApp::C::Catalog;
fc7ec1d9 673
674 use strict;
675 use base 'Catalyst::Base';
676
677 __PACKAGE__->config( foo => 'bar' );
678
679 1;
680
6b10c72b 681You don't have to C<use> or otherwise register Models, Views, and
682Controllers. Catalyst automatically discovers and instantiates them
683when you call C<setup> in the main application. All you need to do is
684put them in directories named for each Component type. Notice that you
685can use some very terse aliases for each one.
fc7ec1d9 686
687=over 4
688
4a6895ce 689=item * B<MyApp/Model/>
fc7ec1d9 690
4a6895ce 691=item * B<MyApp/M/>
fc7ec1d9 692
4a6895ce 693=item * B<MyApp/View/>
fc7ec1d9 694
4a6895ce 695=item * B<MyApp/V/>
fc7ec1d9 696
4a6895ce 697=item * B<MyApp/Controller/>
fc7ec1d9 698
4a6895ce 699=item * B<MyApp/C/>
fc7ec1d9 700
701=back
702
703=head4 Views
704
129cfe74 705To show how to define views, we'll use an already-existing base class for the
706L<Template Toolkit|Template>, L<Catalyst::View::TT>. All we need to do is
707inherit from this class:
fc7ec1d9 708
709 package MyApp::V::TT;
710
711 use strict;
712 use base 'Catalyst::View::TT';
713
714 1;
715
b33ed88c 716(You can also generate this automatically by using the helper script:
717
718 script/myapp_create.pl view TT TT
719
fb9257c1 720where the first C<TT> tells the script that the name of the view should
721be C<TT>, and the second that it should be a Template Toolkit view.)
b33ed88c 722
129cfe74 723This gives us a process() method and we can now just do
724$c->forward('MyApp::V::TT') to render our templates. The base class makes
725process() implicit, so we don't have to say C<$c-E<gt>forward(qw/MyApp::V::TT
726process/)>.
fc7ec1d9 727
e3dc9d78 728 sub hello : Global {
5a8ed4fe 729 my ( $self, $c ) = @_;
730 $c->stash->{template} = 'hello.tt';
731 }
fc7ec1d9 732
5a8ed4fe 733 sub end : Private {
734 my ( $self, $c ) = @_;
2feb6632 735 $c->forward('MyApp::V::TT');
5a8ed4fe 736 }
fc7ec1d9 737
6b10c72b 738You normally render templates at the end of a request, so it's a perfect
739use for the global C<end> action.
fc7ec1d9 740
129cfe74 741Also, be sure to put the template under the directory specified in
6b10c72b 742C<$c-E<gt>config-E<gt>{root}>, or you'll be forced to look at our
743eyecandy debug screen. ;)
fc7ec1d9 744
745=head4 Models
746
129cfe74 747To show how to define models, again we'll use an already-existing base class,
748this time for L<Class::DBI>: L<Catalyst::Model::CDBI>.
fc7ec1d9 749
750But first, we need a database.
751
752 -- myapp.sql
753 CREATE TABLE foo (
754 id INTEGER PRIMARY KEY,
755 data TEXT
756 );
757
758 CREATE TABLE bar (
759 id INTEGER PRIMARY KEY,
760 foo INTEGER REFERENCES foo,
761 data TEXT
762 );
763
764 INSERT INTO foo (data) VALUES ('TEST!');
765
766
767 % sqlite /tmp/myapp.db < myapp.sql
768
769Now we can create a CDBI component for this database.
770
771 package MyApp::M::CDBI;
772
773 use strict;
774 use base 'Catalyst::Model::CDBI';
775
776 __PACKAGE__->config(
777 dsn => 'dbi:SQLite:/tmp/myapp.db',
778 relationships => 1
779 );
780
781 1;
782
129cfe74 783Catalyst automatically loads table layouts and relationships. Use the stash to
784pass data to your templates.
fc7ec1d9 785
786 package MyApp;
787
788 use strict;
789 use Catalyst '-Debug';
790
791 __PACKAGE__->config(
792 name => 'My Application',
793 root => '/home/joeuser/myapp/root'
794 );
cda8d1ac 795
796 __PACKAGE__->setup;
fc7ec1d9 797
5a8ed4fe 798 sub end : Private {
799 my ( $self, $c ) = @_;
800 $c->stash->{template} ||= 'index.tt';
801 $c->forward('MyApp::V::TT');
802 }
fc7ec1d9 803
e3dc9d78 804 sub view : Global {
5a8ed4fe 805 my ( $self, $c, $id ) = @_;
806 $c->stash->{item} = MyApp::M::CDBI::Foo->retrieve($id);
807 }
fc7ec1d9 808
809 1;
810
6b10c72b 811 # Then, in a TT template:
fc7ec1d9 812 The id is [% item.data %]
813
6b10c72b 814Models do not have to be part of your Catalyst application; you
815can always call an outside module that serves as your Model:
816
817 # in a Controller
818 sub list : Local {
819 my ( $self, $c ) = @_;
820 $c->stash->{template} = 'list.tt';
821 use Some::Outside::CDBI::Module;
822 my @records = Some::Outside::CDBI::Module->retrieve_all;
823 $c->stash->{records} = \@records;
824 }
825
826But by using a Model that is part of your Catalyst application, you gain
827several things: you don't have to C<use> each component, Catalyst will
828find and load it automatically at compile-time; you can C<forward> to
26e73131 829the module, which can only be done to Catalyst components; and only
6b10c72b 830Catalyst components can be fetched with
831C<$c-E<gt>comp('MyApp::M::SomeModel')>.
832
833Happily, since many people have existing Model classes that they
834would like to use with Catalyst (or, conversely, they want to
835write Catalyst models that can be used outside of Catalyst, e.g.
836in a cron job), it's trivial to write a simple component in
837Catalyst that slurps in an outside Model:
838
839 package MyApp::M::Catalog;
840 use base qw/Catalyst::Base Some::Other::CDBI::Module::Catalog/;
841 1;
842
843and that's it! Now C<Some::Other::CDBI::Module::Catalog> is part of your
844Cat app as C<MyApp::M::Catalog>.
845
fc7ec1d9 846=head4 Controllers
847
129cfe74 848Multiple controllers are a good way to separate logical domains of your
849application.
fc7ec1d9 850
851 package MyApp::C::Login;
852
fb9257c1 853 sub sign-in : Local { }
854 sub new-password : Local { }
855 sub sign-out : Local { }
fc7ec1d9 856
857 package MyApp::C::Catalog;
858
e3dc9d78 859 sub view : Local { }
860 sub list : Local { }
fc7ec1d9 861
862 package MyApp::C::Cart;
863
e3dc9d78 864 sub add : Local { }
865 sub update : Local { }
866 sub order : Local { }
fc7ec1d9 867
868=head3 Testing
869
129cfe74 870Catalyst has a built-in http server for testing! (Later, you can easily use a
871more powerful server, e.g. Apache/mod_perl, in a production environment.)
fc7ec1d9 872
873Start your application on the command line...
874
b33ed88c 875 script/myapp_server.pl
fc7ec1d9 876
877...then visit http://localhost:3000/ in a browser to view the output.
878
879You can also do it all from the command line:
880
b33ed88c 881 script/myapp_test.pl http://localhost/
fc7ec1d9 882
883Have fun!
884
3cb1db8c 885=head1 SUPPORT
886
887IRC:
888
889 Join #catalyst on irc.perl.org.
890
72d9bfc7 891Mailing-lists:
3cb1db8c 892
893 http://lists.rawmode.org/mailman/listinfo/catalyst
894 http://lists.rawmode.org/mailman/listinfo/catalyst-dev
895
fc7ec1d9 896=head1 AUTHOR
897
cda8d1ac 898Sebastian Riedel, C<sri@oook.de>
899David Naughton, C<naughton@umn.edu>
900Marcus Ramberg, C<mramberg@cpan.org>
f531dd37 901Jesse Sheidlower, C<jester@panix.com>
129cfe74 902Danijel Milicevic, C<me@danijel.de>
fc7ec1d9 903
904=head1 COPYRIGHT
905
906This program is free software, you can redistribute it and/or modify it under
907the same terms as Perl itself.