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