modified to introduce Controller::Root
[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
51aec62b 164(NOTE: Although we create a controller here, we don't actually use it.
165Both of these URLs should take you to the welcome page.)
166
167
fc7ec1d9 168=over 4
169
170=item http://localhost:3000/
171
ac4a0ae0 172=item http://localhost:3000/library/login/
fc7ec1d9 173
174=back
175
56d8daeb 176Easy!
fc7ec1d9 177
178=head2 How It Works
179
e178a66a 180Let's see how Catalyst works, by taking a closer look at the components
181and other parts of a Catalyst application.
fc7ec1d9 182
183=head3 Application Class
184
e178a66a 185In addition to the Model, View, and Controller components, there's a
186single class that represents your application itself. This is where you
c37916b0 187configure your application, load plugins, and extend Catalyst.
fc7ec1d9 188
189 package MyApp;
190
191 use strict;
192 use Catalyst qw/-Debug/;
193
194 MyApp->config(
195 name => 'My Application',
fc7ec1d9 196
b33ed88c 197 # You can put anything else you want in here:
198 my_configuration_variable => 'something',
fc7ec1d9 199 );
fc7ec1d9 200 1;
201
fc7ec1d9 202=over 4
203
4a6895ce 204=item * B<name>
fc7ec1d9 205
56d8daeb 206The name of your application.
fc7ec1d9 207
fc7ec1d9 208=back
209
e178a66a 210Optionally, you can specify a B<root> parameter for templates and static
211data. If omitted, Catalyst will try to auto-detect the directory's
212location. You can define as many parameters as you want for plugins or
213whatever you need. You can access them anywhere in your application via
214C<$context-E<gt>config-E<gt>{$param_name}>.
fc7ec1d9 215
216=head3 Context
217
e178a66a 218Catalyst automatically blesses a Context object into your application
219class and makes it available everywhere in your application. Use the
cccc887d 220Context to directly interact with Catalyst and glue your L</Components>
e178a66a 221together. For example, if you need to use the Context from within a
222Template Toolkit template, it's already there:
c42f5bbf 223
224 <h1>Welcome to [% c.config.name %]!</h1>
fc7ec1d9 225
e178a66a 226As illustrated in our URL-to-Action dispatching example, the Context is
227always the second method parameter, behind the Component object
228reference or class name itself. Previously we called it C<$context> for
229clarity, but most Catalyst 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
fc7ec1d9 268 $c->config->root;
269 $c->config->name;
270
271=item * L<Catalyst::Log>
272
273 $c->log
fc7ec1d9 274 $c->log->debug('Something happened');
275 $c->log->info('Something you should know');
276
4a6895ce 277=item * B<Stash>
fc7ec1d9 278
279 $c->stash
fc7ec1d9 280 $c->stash->{foo} = 'bar';
281
282=back
283
129cfe74 284The last of these, the stash, is a universal hash for sharing data among
285application components. For an example, we return to our 'hello' action:
fc7ec1d9 286
e3dc9d78 287 sub hello : Global {
5a8ed4fe 288 my ( $self, $c ) = @_;
289 $c->stash->{message} = 'Hello World!';
4c6807d2 290 $c->forward('show_message');
5a8ed4fe 291 }
fc7ec1d9 292
4c6807d2 293 sub show_message : Private {
5a8ed4fe 294 my ( $self, $c ) = @_;
66f6e959 295 $c->res->body( $c->stash->{message} );
5a8ed4fe 296 }
fc7ec1d9 297
e178a66a 298Note that the stash should be used only for passing data in an
299individual request cycle; it gets cleared at a new request. If you need
300to maintain more persistent data, use a session.
dd25a192 301
fc7ec1d9 302=head3 Actions
303
c37916b0 304
305
56d8daeb 306A Catalyst controller is defined by its actions. An action is a
307subroutine with a special attribute. You've already seen some examples
308of actions in this document. The URL (for example
309http://localhost.3000/foo/bar) consists of two parts, the base
310(http://localhost:3000/ in this example) and the path (foo/bar). Please
311note that the trailing slash after the hostname[:port] always belongs to
312base and not to the action.
cda8d1ac 313
c37916b0 314=over 4
315
316=item * B<Application Wide Actions>
317
318Actions which are called at the root level of the application
319(e.g. http:///localhost:3000/ ) go in MyApp::Controller::Root, like
320this:
321
322 package MyApp::Controller::Root;
323 use base 'Catalyst::Controller';
324 # Sets the actions in this controller to be registered with no prefix
325 # so they function identically to actions created in MyApp.pm
326 __PACKAGE__->config->{namespace} = '';
327 sub default : Private {
328 my ( $self, $context ) = @_;
329 $context->response->body('Catalyst rocks!');
330 }
331 1;
332
333
334=back
335
336For most applications, Catalyst requires you to define only one config
337parameter:
338
339=head4 Action types
340
cda8d1ac 341Catalyst supports several types of actions:
fc7ec1d9 342
343=over 4
344
56d8daeb 345=item * B<Literal> (B<Path> actions)
fc7ec1d9 346
e178a66a 347 package MyApp::Controller::My::Controller;
f29c48dd 348 sub bar : Path('foo/bar') { }
fc7ec1d9 349
e178a66a 350Literal C<Path> actions will act relative to their current
351namespace. The above example matches only
352http://localhost:3000/my/controller/foo/bar. If you start your path with
353a forward slash, it will match from the root. Example:
0cf56dbc 354
e178a66a 355 package MyApp::Controller::My::Controller;
0cf56dbc 356 sub bar : Path('/foo/bar') { }
357
fc7ec1d9 358Matches only http://localhost:3000/foo/bar.
359
e178a66a 360 package MyApp::Controller::My::Controller;
0cf56dbc 361 sub bar : Path { }
362
e178a66a 363By leaving the C<Path> definition empty, it will match on the namespace
364root. The above code matches http://localhost:3000/my/controller.
0cf56dbc 365
4a6895ce 366=item * B<Regex>
fc7ec1d9 367
b33ed88c 368 sub bar : Regex('^item(\d+)/order(\d+)$') { }
fc7ec1d9 369
129cfe74 370Matches any URL that matches the pattern in the action key, e.g.
e178a66a 371http://localhost:3000/item23/order42. The '' around the regexp is
372optional, but perltidy likes it. :)
b33ed88c 373
e178a66a 374Regex matches act globally, i.e. without reference to the namespace from
375which it is called, so that a C<bar> method in the
376C<MyApp::Controller::Catalog::Order::Process> namespace won't match any
377form of C<bar>, C<Catalog>, C<Order>, or C<Process> unless you
378explicitly put this in the regex. To achieve the above, you should
379consider using a C<LocalRegex> action.
66f6e959 380
381=item * B<LocalRegex>
382
383 sub bar : LocalRegex('^widget(\d+)$') { }
fc7ec1d9 384
66f6e959 385LocalRegex actions act locally. If you were to use C<bar> in
0cf56dbc 386C<MyApp::Controller::Catalog>, the above example would match urls like
387http://localhost:3000/catalog/widget23.
388
e178a66a 389If you omit the "C<^>" from your regex, then it will match any depth
390from the controller and not immediately off of the controller name. The
391following example differs from the above code in that it will match
0cf56dbc 392http://localhost:3000/catalog/foo/widget23 as well.
393
394 package MyApp::Controller::Catalog;
395 sub bar : LocalRegex('widget(\d+)$') { }
66f6e959 396
e178a66a 397For both LocalRegex and Regex actions, if you use capturing parentheses
398to extract values within the matching URL, those values are available in
2982e768 399the C<$c-E<gt>req-E<gt>captures> array. In the above example, "widget23"
e178a66a 400would capture "23" in the above example, and
2982e768 401C<$c-E<gt>req-E<gt>captures-E<gt>[0]> would be "23". If you want to pass
e178a66a 402arguments at the end of your URL, you must use regex action keys. See
403L</URL Path Handling> below.
fc7ec1d9 404
56d8daeb 405=item * B<Top-level> (B<Global>)
cda8d1ac 406
c37916b0 407 package MyApp::Controller::Foo;
cda8d1ac 408 sub foo : Global { }
409
c37916b0 410Matches http://localhost:3000/foo. The function name is mapped
411directly to the application base. You can provide an equivalent
412function in this case by doing the following:
413
414 package MyApp::Controller::Root
415 sub foo : Local { }
cda8d1ac 416
56d8daeb 417=item * B<Namespace-Prefixed> (B<Local>)
fc7ec1d9 418
e178a66a 419 package MyApp::Controller::My::Controller;
e3dc9d78 420 sub foo : Local { }
fc7ec1d9 421
cda8d1ac 422Matches http://localhost:3000/my/controller/foo.
fc7ec1d9 423
129cfe74 424This action type indicates that the matching URL must be prefixed with a
e178a66a 425modified form of the component's class (package) name. This modified
426class name excludes the parts that have a pre-defined meaning in
427Catalyst ("MyApp::Controller" in the above example), replaces "::" with
428"/", and converts the name to lower case. See L</Components> for a full
429explanation of the pre-defined meaning of Catalyst component class
430names.
fc7ec1d9 431
4a6895ce 432=item * B<Private>
fc7ec1d9 433
5a8ed4fe 434 sub foo : Private { }
fc7ec1d9 435
e178a66a 436Matches no URL, and cannot be executed by requesting a URL that
437corresponds to the action key. Private actions can be executed only
438inside a Catalyst application, by calling the C<forward> method:
fc7ec1d9 439
5a8ed4fe 440 $c->forward('foo');
fc7ec1d9 441
129cfe74 442See L</Flow Control> for a full explanation of C<forward>. Note that, as
fc9c8698 443discussed there, when forwarding from another component, you must use
444the absolute path to the method, so that a private C<bar> method in your
445C<MyApp::Controller::Catalog::Order::Process> controller must, if called
446from elsewhere, be reached with
447C<$c-E<gt>forward('/catalog/order/process/bar')>.
fc7ec1d9 448
baf5120b 449=item * B<Args>
450
451Args is not an action type per se, but an action modifier - it adds a match
452restriction to any action it's provided to, requiring only as many path parts
453as are specified for the action to be valid - for example in
454MyApp::Controller::Foo,
455
456 sub bar :Local
457
458would match any URL starting /foo/bar/. To restrict this you can do
459
460 sub bar :Local :Args(1)
461
462to only match /foo/bar/*/
463
fc7ec1d9 464=back
465
b33ed88c 466B<Note:> After seeing these examples, you probably wonder what the point
56d8daeb 467is of defining names for regex and path actions. Every public action is
468also a private one, so you have one unified way of addressing components
469in your C<forward>s.
cda8d1ac 470
72d9bfc7 471=head4 Built-in Private Actions
fc7ec1d9 472
fc9c8698 473In response to specific application states, Catalyst will automatically
474call these built-in private actions in your application class:
fc7ec1d9 475
476=over 4
477
cda8d1ac 478=item * B<default : Private>
fc7ec1d9 479
fc9c8698 480Called when no other action matches. Could be used, for example, for
481displaying a generic frontpage for the main app, or an error page for
482individual controllers.
fc7ec1d9 483
0cf56dbc 484If C<default> isn't acting how you would expect, look at using a
cccc887d 485L</Literal> C<Path> action (with an empty path string). The difference is
e178a66a 486that C<Path> takes arguments relative from the namespace and C<default>
487I<always> takes arguments relative from the root, regardless of what
488controller it's in.
0cf56dbc 489
66f6e959 490=item * B<index : Private>
491
492C<index> is much like C<default> except that it takes no arguments
e178a66a 493and it is weighted slightly higher in the matching process. It is
494useful as a static entry point to a controller, e.g. to have a static
61a9002d 495welcome page. Note that it's also weighted higher than Path.
66f6e959 496
cda8d1ac 497=item * B<begin : Private>
fc7ec1d9 498
fc9c8698 499Called at the beginning of a request, before any matching actions are
500called.
fc7ec1d9 501
cda8d1ac 502=item * B<end : Private>
4a6895ce 503
fc7ec1d9 504Called at the end of a request, after all matching actions are called.
505
fc9c8698 506=back
507
6b10c72b 508=head4 Built-in actions in controllers/autochaining
fc7ec1d9 509
e178a66a 510 Package MyApp::Controller::Foo;
cda8d1ac 511 sub begin : Private { }
5a8ed4fe 512 sub default : Private { }
eff5f524 513 sub auto : Private { }
fc7ec1d9 514
fc9c8698 515You can define built-in private actions within your controllers as
516well. The actions will override the ones in less-specific controllers,
517or your application class. In other words, for each of the three
518built-in private actions, only one will be run in any request
e178a66a 519cycle. Thus, if C<MyApp::Controller::Catalog::begin> exists, it will be
520run in place of C<MyApp::begin> if you're in the C<catalog> namespace,
521and C<MyApp::Controller::Catalog::Order::begin> would override this in
522turn.
fc9c8698 523
eff5f524 524In addition to the normal built-in actions, you have a special action
525for making chains, C<auto>. Such C<auto> actions will be run after any
fc9c8698 526C<begin>, but before your action is processed. Unlike the other
eff5f524 527built-ins, C<auto> actions I<do not> override each other; they will be
528called in turn, starting with the application class and going through to
529the I<most> specific class. I<This is the reverse of the order in which
530the normal built-ins override each other>.
fc9c8698 531
532Here are some examples of the order in which the various built-ins
533would be called:
cda8d1ac 534
535=over 4
536
fc9c8698 537=item for a request for C</foo/foo>
cda8d1ac 538
539 MyApp::begin
80ef2e6d 540 MyApp::auto
e178a66a 541 MyApp::Controller::Foo::default # in the absence of MyApp::Controller::Foo::Foo
cda8d1ac 542 MyApp::end
543
fc9c8698 544=item for a request for C</foo/bar/foo>
cda8d1ac 545
e178a66a 546 MyApp::Controller::Foo::Bar::begin
80ef2e6d 547 MyApp::auto
e178a66a 548 MyApp::Controller::Foo::auto
549 MyApp::Controller::Foo::Bar::auto
550 MyApp::Controller::Foo::Bar::default # for MyApp::Controller::Foo::Bar::foo
551 MyApp::Controller::Foo::Bar::end
80ef2e6d 552
553=back
554
fc9c8698 555The C<auto> action is also distinguished by the fact that you can break
556out of the processing chain by returning 0. If an C<auto> action returns
5570, any remaining actions will be skipped, except for C<end>. So, for the
558request above, if the first auto returns false, the chain would look
559like this:
80ef2e6d 560
561=over 4
562
fc9c8698 563=item for a request for C</foo/bar/foo> where first C<auto> returns
564false
80ef2e6d 565
e178a66a 566 MyApp::Controller::Foo::Bar::begin
80ef2e6d 567 MyApp::auto
e178a66a 568 MyApp::Controller::Foo::Bar::end
cda8d1ac 569
570=back
4a6895ce 571
fc9c8698 572An example of why one might use this is an authentication action: you
573could set up a C<auto> action to handle authentication in your
574application class (which will always be called first), and if
575authentication fails, returning 0 would skip any remaining methods
576for that URL.
03805733 577
fc9c8698 578B<Note:> Looking at it another way, C<auto> actions have to return a
579true value to continue processing! You can also C<die> in the autochain
580action; in that case, the request will go straight to the finalize
581stage, without processing further actions.
03805733 582
6b10c72b 583=head4 URL Path Handling
4a6895ce 584
70d5ae49 585You can pass variable arguments as part of the URL path, separated with
586forward slashes (/). If the action is a Regex or LocalRegex, the '$' anchor
587must be used. For example, suppose you want to handle C</foo/$bar/$baz>,
588where C<$bar> and C<$baz> may vary:
4a6895ce 589
cda8d1ac 590 sub foo : Regex('^foo$') { my ($self, $context, $bar, $baz) = @_; }
4a6895ce 591
fc9c8698 592But what if you also defined actions for C</foo/boo> and C</foo/boo/hoo>?
4a6895ce 593
f29c48dd 594 sub boo : Path('foo/boo') { .. }
595 sub hoo : Path('foo/boo/hoo') { .. }
4a6895ce 596
597Catalyst matches actions in most specific to least specific order:
598
599 /foo/boo/hoo
600 /foo/boo
fc9c8698 601 /foo # might be /foo/bar/baz but won't be /foo/boo/hoo
4a6895ce 602
fc9c8698 603So Catalyst would never mistakenly dispatch the first two URLs to the
604'^foo$' action.
fc7ec1d9 605
70d5ae49 606If a Regex or LocalRegex action doesn't use the '$' anchor, the action will
607still match a URL containing arguments, however the arguments won't be
608available via C<@_>.
609
6b10c72b 610=head4 Parameter Processing
2ef2fb0f 611
fc9c8698 612Parameters passed in the URL query string are handled with methods in
613the L<Catalyst::Request> class. The C<param> method is functionally
614equivalent to the C<param> method of C<CGI.pm> and can be used in
615modules that require this.
2ef2fb0f 616
617 # http://localhost:3000/catalog/view/?category=hardware&page=3
618 my $category = $c->req->param('category');
619 my $current_page = $c->req->param('page') || 1;
620
621 # multiple values for single parameter name
622 my @values = $c->req->param('scrolling_list');
623
624 # DFV requires a CGI.pm-like input hash
625 my $results = Data::FormValidator->check($c->req->params, \%dfv_profile);
626
fc7ec1d9 627=head3 Flow Control
628
d08ced28 629You control the application flow with the C<forward> method, which
630accepts the key of an action to execute. This can be an action in the
631same or another Catalyst controller, or a Class name, optionally
632followed by a method name. After a C<forward>, the control flow will
633return to the method from which the C<forward> was issued.
634
635A C<forward> is similar to a method call. The main differences are that
636it wraps the call in an C<eval> to allow exception handling; it
637automatically passes along the context object (C<$c> or C<$context>);
638and it allows profiling of each call (displayed in the log with
639debugging enabled).
fc7ec1d9 640
e3dc9d78 641 sub hello : Global {
5a8ed4fe 642 my ( $self, $c ) = @_;
643 $c->stash->{message} = 'Hello World!';
d08ced28 644 $c->forward('check_message'); # $c is automatically included
5a8ed4fe 645 }
fc7ec1d9 646
4c6807d2 647 sub check_message : Private {
5a8ed4fe 648 my ( $self, $c ) = @_;
649 return unless $c->stash->{message};
4c6807d2 650 $c->forward('show_message');
5a8ed4fe 651 }
fc7ec1d9 652
4c6807d2 653 sub show_message : Private {
5a8ed4fe 654 my ( $self, $c ) = @_;
66f6e959 655 $c->res->body( $c->stash->{message} );
5a8ed4fe 656 }
3323f920 657
d08ced28 658A C<forward> does not create a new request, so your request
659object (C<$c-E<gt>req>) will remain unchanged. This is a
660key difference between using C<forward> and issuing a
661redirect.
3323f920 662
d08ced28 663You can pass new arguments to a C<forward> by adding them
664in an anonymous array. In this case C<$c-E<gt>req-E<gt>args>
665will be changed for the duration of the C<forward> only; upon
666return, the original value of C<$c-E<gt>req-E<gt>args> will
667be reset.
3323f920 668
669 sub hello : Global {
670 my ( $self, $c ) = @_;
671 $c->stash->{message} = 'Hello World!';
d08ced28 672 $c->forward('check_message',[qw/test1/]);
673 # now $c->req->args is back to what it was before
3323f920 674 }
675
d08ced28 676 sub check_message : Private {
677 my ( $self, $c ) = @_;
fabf3a10 678 my $first_argument = $c->req->args->[0]; # now = 'test1'
d08ced28 679 # do something...
680 }
b248fa4a 681
d08ced28 682As you can see from these examples, you can just use the method name as
683long as you are referring to methods in the same controller. If you want
684to forward to a method in another controller, or the main application,
685you will have to refer to the method by absolute path.
cda8d1ac 686
687 $c->forward('/my/controller/action');
d08ced28 688 $c->forward('/default'); # calls default in main application
fc7ec1d9 689
d08ced28 690Here are some examples of how to forward to classes and methods.
fc7ec1d9 691
e3dc9d78 692 sub hello : Global {
5a8ed4fe 693 my ( $self, $c ) = @_;
e178a66a 694 $c->forward(qw/MyApp::Model::Hello say_hello/);
5a8ed4fe 695 }
fc7ec1d9 696
e3dc9d78 697 sub bye : Global {
5a8ed4fe 698 my ( $self, $c ) = @_;
e178a66a 699 $c->forward('MyApp::Model::Hello'); # no method: will try 'process'
5a8ed4fe 700 }
fc7ec1d9 701
e178a66a 702 package MyApp::Model::Hello;
fc7ec1d9 703
704 sub say_hello {
705 my ( $self, $c ) = @_;
66f6e959 706 $c->res->body('Hello World!');
fc7ec1d9 707 }
708
709 sub process {
710 my ( $self, $c ) = @_;
66f6e959 711 $c->res->body('Goodbye World!');
fc7ec1d9 712 }
713
d08ced28 714Note that C<forward> returns to the calling action and continues
13436c14 715processing after the action finishes. If you want all further processing
716in the calling action to stop, use C<detach> instead, which will execute
717the C<detach>ed action and not return to the calling sub. In both cases,
718Catalyst will automatically try to call process() if you omit the
719method.
fc7ec1d9 720
721=head3 Components
722
56d8daeb 723Catalyst has an uncommonly flexible component system. You can define as
cccc887d 724many L</Models>, L</Views>, and L</Controllers> as you like.
fc7ec1d9 725
56d8daeb 726All components must inherit from L<Catalyst::Base>, which provides a
727simple class structure and some common class methods like C<config> and
728C<new> (constructor).
fc7ec1d9 729
e178a66a 730 package MyApp::Controller::Catalog;
fc7ec1d9 731
732 use strict;
733 use base 'Catalyst::Base';
734
735 __PACKAGE__->config( foo => 'bar' );
736
737 1;
738
6b10c72b 739You don't have to C<use> or otherwise register Models, Views, and
740Controllers. Catalyst automatically discovers and instantiates them
741when you call C<setup> in the main application. All you need to do is
742put them in directories named for each Component type. Notice that you
743can use some very terse aliases for each one.
fc7ec1d9 744
745=over 4
746
4a6895ce 747=item * B<MyApp/Model/>
fc7ec1d9 748
4a6895ce 749=item * B<MyApp/M/>
fc7ec1d9 750
4a6895ce 751=item * B<MyApp/View/>
fc7ec1d9 752
4a6895ce 753=item * B<MyApp/V/>
fc7ec1d9 754
4a6895ce 755=item * B<MyApp/Controller/>
fc7ec1d9 756
4a6895ce 757=item * B<MyApp/C/>
fc7ec1d9 758
759=back
760
761=head4 Views
762
129cfe74 763To show how to define views, we'll use an already-existing base class for the
764L<Template Toolkit|Template>, L<Catalyst::View::TT>. All we need to do is
765inherit from this class:
fc7ec1d9 766
e178a66a 767 package MyApp::View::TT;
fc7ec1d9 768
769 use strict;
770 use base 'Catalyst::View::TT';
771
772 1;
773
b33ed88c 774(You can also generate this automatically by using the helper script:
775
776 script/myapp_create.pl view TT TT
777
fb9257c1 778where the first C<TT> tells the script that the name of the view should
779be C<TT>, and the second that it should be a Template Toolkit view.)
b33ed88c 780
129cfe74 781This gives us a process() method and we can now just do
e178a66a 782$c->forward('MyApp::View::TT') to render our templates. The base class
783makes process() implicit, so we don't have to say
784C<$c-E<gt>forward(qw/MyApp::View::TT process/)>.
fc7ec1d9 785
e3dc9d78 786 sub hello : Global {
5a8ed4fe 787 my ( $self, $c ) = @_;
788 $c->stash->{template} = 'hello.tt';
789 }
fc7ec1d9 790
5a8ed4fe 791 sub end : Private {
792 my ( $self, $c ) = @_;
e178a66a 793 $c->forward('MyApp::View::TT');
5a8ed4fe 794 }
fc7ec1d9 795
6b10c72b 796You normally render templates at the end of a request, so it's a perfect
797use for the global C<end> action.
fc7ec1d9 798
129cfe74 799Also, be sure to put the template under the directory specified in
6b10c72b 800C<$c-E<gt>config-E<gt>{root}>, or you'll be forced to look at our
801eyecandy debug screen. ;)
fc7ec1d9 802
803=head4 Models
804
e178a66a 805To show how to define models, again we'll use an already-existing base
e112461a 806class, this time for L<DBIx::Class>: L<Catalyst::Model::DBIC::Schema>.
807We'll also need L<DBIx::Class::Schema::Loader>.
fc7ec1d9 808
809But first, we need a database.
810
811 -- myapp.sql
812 CREATE TABLE foo (
813 id INTEGER PRIMARY KEY,
814 data TEXT
815 );
816
817 CREATE TABLE bar (
818 id INTEGER PRIMARY KEY,
819 foo INTEGER REFERENCES foo,
820 data TEXT
821 );
822
823 INSERT INTO foo (data) VALUES ('TEST!');
824
825
826 % sqlite /tmp/myapp.db < myapp.sql
827
e112461a 828Now we can create a DBIC::SchemaLoader component for this database.
fc7ec1d9 829
e112461a 830 script/myapp_create.pl model DBIC DBIC::SchemaLoader 'dbi:SQLite:/tmp/myapp.db'
fc7ec1d9 831
e112461a 832L<DBIx::Class::Schema::Loader> automatically loads table layouts and
833relationships. Use the stash to pass data to your templates.
fc7ec1d9 834
e112461a 835We add the following to MyApp/Controller/Root.pm
b248fa4a 836
e112461a 837 sub view : Global {
838 my ( $self, $c, $id ) = @_;
839
840 $c->stash->{item} = $c->model('DBIC::Foo')->find($id);
841 }
fc7ec1d9 842
e112461a 843 1;
844
5a8ed4fe 845 sub end : Private {
846 my ( $self, $c ) = @_;
e112461a 847
5a8ed4fe 848 $c->stash->{template} ||= 'index.tt';
e112461a 849 $c->forward( $c->view('TT') );
5a8ed4fe 850 }
fc7ec1d9 851
e112461a 852We then create a new template file "root/index.tt" containing:
fc7ec1d9 853
e112461a 854 The Id's data is [% item.data %]
fc7ec1d9 855
6b10c72b 856Models do not have to be part of your Catalyst application; you
857can always call an outside module that serves as your Model:
858
859 # in a Controller
860 sub list : Local {
861 my ( $self, $c ) = @_;
e112461a 862
6b10c72b 863 $c->stash->{template} = 'list.tt';
e112461a 864
865 use Some::Outside::DBIC::Module;
866 my @records = Some::Outside::DBIC::Module->search({
867 artist => 'sri',
868 });
869
6b10c72b 870 $c->stash->{records} = \@records;
871 }
872
873But by using a Model that is part of your Catalyst application, you gain
874several things: you don't have to C<use> each component, Catalyst will
875find and load it automatically at compile-time; you can C<forward> to
26e73131 876the module, which can only be done to Catalyst components; and only
6b10c72b 877Catalyst components can be fetched with
e178a66a 878C<$c-E<gt>model('SomeModel')>.
6b10c72b 879
880Happily, since many people have existing Model classes that they
881would like to use with Catalyst (or, conversely, they want to
882write Catalyst models that can be used outside of Catalyst, e.g.
883in a cron job), it's trivial to write a simple component in
884Catalyst that slurps in an outside Model:
885
e112461a 886 package MyApp::Model::DB;
887 use base qw/Catalyst::Model::DBIC::Schema/;
888 __PACKAGE__->config(
889 schema_class => 'Some::DBIC::Schema',
cccc887d 890 connect_info => ['dbi:SQLite:foo.db', '', '', {AutoCommit=>1}]
e112461a 891 );
6b10c72b 892 1;
893
e112461a 894and that's it! Now C<Some::DBIC::Schema> is part of your
895Cat app as C<MyApp::Model::DB>.
6b10c72b 896
fc7ec1d9 897=head4 Controllers
898
129cfe74 899Multiple controllers are a good way to separate logical domains of your
900application.
fc7ec1d9 901
e178a66a 902 package MyApp::Controller::Login;
fc7ec1d9 903
c02f7490 904 use base qw/Catalyst::Controller/;
905
906 sub sign_in : Path("sign-in") { }
907 sub new_password : Path("new-password") { }
908 sub sign_out : Path("sign-out") { }
fc7ec1d9 909
e178a66a 910 package MyApp::Controller::Catalog;
fc7ec1d9 911
c02f7490 912 use base qw/Catalyst::Controller/;
913
e3dc9d78 914 sub view : Local { }
915 sub list : Local { }
fc7ec1d9 916
e178a66a 917 package MyApp::Controller::Cart;
fc7ec1d9 918
c02f7490 919 use base qw/Catalyst::Controller/;
920
e3dc9d78 921 sub add : Local { }
922 sub update : Local { }
923 sub order : Local { }
fc7ec1d9 924
c02f7490 925Note that you can also supply attributes via the Controller's config so long
926as you have at least one attribute on a subref to be exported (:Action is
927commonly used for this) - for example the following is equivalent to the same
928controller above
929
930 package MyApp::Controller::Login;
931
932 use base qw/Catalyst::Controller/;
933
934 __PACKAGE__->config(
935 actions => {
936 'sign_in' => { Path => 'sign-in' },
937 'new_password' => { Path => 'new-password' },
938 'sign_out' => { Path => 'sign-out' },
939 },
940 );
941
942 sub sign_in : Action { }
943 sub new_password : Action { }
944 sub sign_out : Action { }
945
fc7ec1d9 946=head3 Testing
947
e178a66a 948Catalyst has a built-in http server for testing! (Later, you can easily
949use a more powerful server, e.g. Apache/mod_perl, in a production
950environment.)
fc7ec1d9 951
952Start your application on the command line...
953
b33ed88c 954 script/myapp_server.pl
fc7ec1d9 955
956...then visit http://localhost:3000/ in a browser to view the output.
957
958You can also do it all from the command line:
959
b33ed88c 960 script/myapp_test.pl http://localhost/
fc7ec1d9 961
962Have fun!
963
3cb1db8c 964=head1 SUPPORT
965
966IRC:
967
968 Join #catalyst on irc.perl.org.
969
72d9bfc7 970Mailing-lists:
3cb1db8c 971
972 http://lists.rawmode.org/mailman/listinfo/catalyst
973 http://lists.rawmode.org/mailman/listinfo/catalyst-dev
974
fc7ec1d9 975=head1 AUTHOR
976
cda8d1ac 977Sebastian Riedel, C<sri@oook.de>
978David Naughton, C<naughton@umn.edu>
979Marcus Ramberg, C<mramberg@cpan.org>
f531dd37 980Jesse Sheidlower, C<jester@panix.com>
129cfe74 981Danijel Milicevic, C<me@danijel.de>
c37916b0 982Kieren Diment, C<kd@totaldatasolution.com>
fc7ec1d9 983
984=head1 COPYRIGHT
985
aa2b0d97 986This program is free software, you can redistribute it and/or modify it
987under the same terms as Perl itself.