Models, ACCEPT_CONTEXT
[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
d4ef4999 49If you're unfamiliar with MVC and design patterns, you may want to
50check out the original book on the subject, I<Design Patterns>, by
51Gamma, Helm, Johnson, and Vlissides, also known as the Gang of Four
52(GoF). Many, many web application frameworks are based on MVC, which
53is becoming a popular design method for web applications.
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';
d4ef4999 281 $c->stash->{baz} = {baz => 'qox'};
282 $c->stash->{fred} = [qw/ wilma pebbles/];
283
284and so on.
fc7ec1d9 285
286=back
287
129cfe74 288The last of these, the stash, is a universal hash for sharing data among
289application components. For an example, we return to our 'hello' action:
fc7ec1d9 290
e3dc9d78 291 sub hello : Global {
5a8ed4fe 292 my ( $self, $c ) = @_;
293 $c->stash->{message} = 'Hello World!';
4c6807d2 294 $c->forward('show_message');
5a8ed4fe 295 }
fc7ec1d9 296
4c6807d2 297 sub show_message : Private {
5a8ed4fe 298 my ( $self, $c ) = @_;
66f6e959 299 $c->res->body( $c->stash->{message} );
5a8ed4fe 300 }
fc7ec1d9 301
e178a66a 302Note that the stash should be used only for passing data in an
303individual request cycle; it gets cleared at a new request. If you need
304to maintain more persistent data, use a session.
dd25a192 305
fc7ec1d9 306=head3 Actions
307
c37916b0 308
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
c37916b0 318=over 4
319
320=item * B<Application Wide Actions>
321
322Actions which are called at the root level of the application
323(e.g. http:///localhost:3000/ ) go in MyApp::Controller::Root, like
324this:
325
326 package MyApp::Controller::Root;
327 use base 'Catalyst::Controller';
328 # Sets the actions in this controller to be registered with no prefix
329 # so they function identically to actions created in MyApp.pm
330 __PACKAGE__->config->{namespace} = '';
331 sub default : Private {
332 my ( $self, $context ) = @_;
333 $context->response->body('Catalyst rocks!');
334 }
335 1;
336
337
338=back
339
340For most applications, Catalyst requires you to define only one config
341parameter:
342
343=head4 Action types
344
cda8d1ac 345Catalyst supports several types of actions:
fc7ec1d9 346
347=over 4
348
56d8daeb 349=item * B<Literal> (B<Path> actions)
fc7ec1d9 350
e178a66a 351 package MyApp::Controller::My::Controller;
f29c48dd 352 sub bar : Path('foo/bar') { }
fc7ec1d9 353
e178a66a 354Literal C<Path> actions will act relative to their current
355namespace. The above example matches only
356http://localhost:3000/my/controller/foo/bar. If you start your path with
357a forward slash, it will match from the root. Example:
0cf56dbc 358
e178a66a 359 package MyApp::Controller::My::Controller;
0cf56dbc 360 sub bar : Path('/foo/bar') { }
361
fc7ec1d9 362Matches only http://localhost:3000/foo/bar.
363
e178a66a 364 package MyApp::Controller::My::Controller;
0cf56dbc 365 sub bar : Path { }
366
e178a66a 367By leaving the C<Path> definition empty, it will match on the namespace
368root. The above code matches http://localhost:3000/my/controller.
0cf56dbc 369
4a6895ce 370=item * B<Regex>
fc7ec1d9 371
b33ed88c 372 sub bar : Regex('^item(\d+)/order(\d+)$') { }
fc7ec1d9 373
129cfe74 374Matches any URL that matches the pattern in the action key, e.g.
e178a66a 375http://localhost:3000/item23/order42. The '' around the regexp is
376optional, but perltidy likes it. :)
b33ed88c 377
e178a66a 378Regex matches act globally, i.e. without reference to the namespace from
379which it is called, so that a C<bar> method in the
380C<MyApp::Controller::Catalog::Order::Process> namespace won't match any
381form of C<bar>, C<Catalog>, C<Order>, or C<Process> unless you
382explicitly put this in the regex. To achieve the above, you should
383consider using a C<LocalRegex> action.
66f6e959 384
385=item * B<LocalRegex>
386
387 sub bar : LocalRegex('^widget(\d+)$') { }
fc7ec1d9 388
66f6e959 389LocalRegex actions act locally. If you were to use C<bar> in
0cf56dbc 390C<MyApp::Controller::Catalog>, the above example would match urls like
391http://localhost:3000/catalog/widget23.
392
e178a66a 393If you omit the "C<^>" from your regex, then it will match any depth
394from the controller and not immediately off of the controller name. The
395following example differs from the above code in that it will match
0cf56dbc 396http://localhost:3000/catalog/foo/widget23 as well.
397
398 package MyApp::Controller::Catalog;
399 sub bar : LocalRegex('widget(\d+)$') { }
66f6e959 400
e178a66a 401For both LocalRegex and Regex actions, if you use capturing parentheses
402to extract values within the matching URL, those values are available in
2982e768 403the C<$c-E<gt>req-E<gt>captures> array. In the above example, "widget23"
e178a66a 404would capture "23" in the above example, and
2982e768 405C<$c-E<gt>req-E<gt>captures-E<gt>[0]> would be "23". If you want to pass
e178a66a 406arguments at the end of your URL, you must use regex action keys. See
407L</URL Path Handling> below.
fc7ec1d9 408
56d8daeb 409=item * B<Top-level> (B<Global>)
cda8d1ac 410
c37916b0 411 package MyApp::Controller::Foo;
cda8d1ac 412 sub foo : Global { }
413
c37916b0 414Matches http://localhost:3000/foo. The function name is mapped
415directly to the application base. You can provide an equivalent
416function in this case by doing the following:
417
418 package MyApp::Controller::Root
419 sub foo : Local { }
cda8d1ac 420
56d8daeb 421=item * B<Namespace-Prefixed> (B<Local>)
fc7ec1d9 422
e178a66a 423 package MyApp::Controller::My::Controller;
e3dc9d78 424 sub foo : Local { }
fc7ec1d9 425
cda8d1ac 426Matches http://localhost:3000/my/controller/foo.
fc7ec1d9 427
129cfe74 428This action type indicates that the matching URL must be prefixed with a
e178a66a 429modified form of the component's class (package) name. This modified
430class name excludes the parts that have a pre-defined meaning in
431Catalyst ("MyApp::Controller" in the above example), replaces "::" with
432"/", and converts the name to lower case. See L</Components> for a full
433explanation of the pre-defined meaning of Catalyst component class
434names.
fc7ec1d9 435
4a6895ce 436=item * B<Private>
fc7ec1d9 437
5a8ed4fe 438 sub foo : Private { }
fc7ec1d9 439
e178a66a 440Matches no URL, and cannot be executed by requesting a URL that
441corresponds to the action key. Private actions can be executed only
442inside a Catalyst application, by calling the C<forward> method:
fc7ec1d9 443
5a8ed4fe 444 $c->forward('foo');
fc7ec1d9 445
129cfe74 446See L</Flow Control> for a full explanation of C<forward>. Note that, as
fc9c8698 447discussed there, when forwarding from another component, you must use
448the absolute path to the method, so that a private C<bar> method in your
449C<MyApp::Controller::Catalog::Order::Process> controller must, if called
450from elsewhere, be reached with
451C<$c-E<gt>forward('/catalog/order/process/bar')>.
fc7ec1d9 452
baf5120b 453=item * B<Args>
454
455Args is not an action type per se, but an action modifier - it adds a match
456restriction to any action it's provided to, requiring only as many path parts
457as are specified for the action to be valid - for example in
458MyApp::Controller::Foo,
459
460 sub bar :Local
461
462would match any URL starting /foo/bar/. To restrict this you can do
463
464 sub bar :Local :Args(1)
465
466to only match /foo/bar/*/
467
fc7ec1d9 468=back
469
b33ed88c 470B<Note:> After seeing these examples, you probably wonder what the point
56d8daeb 471is of defining names for regex and path actions. Every public action is
472also a private one, so you have one unified way of addressing components
473in your C<forward>s.
cda8d1ac 474
72d9bfc7 475=head4 Built-in Private Actions
fc7ec1d9 476
fc9c8698 477In response to specific application states, Catalyst will automatically
478call these built-in private actions in your application class:
fc7ec1d9 479
480=over 4
481
cda8d1ac 482=item * B<default : Private>
fc7ec1d9 483
fc9c8698 484Called when no other action matches. Could be used, for example, for
485displaying a generic frontpage for the main app, or an error page for
486individual controllers.
fc7ec1d9 487
0cf56dbc 488If C<default> isn't acting how you would expect, look at using a
cccc887d 489L</Literal> C<Path> action (with an empty path string). The difference is
e178a66a 490that C<Path> takes arguments relative from the namespace and C<default>
491I<always> takes arguments relative from the root, regardless of what
492controller it's in.
0cf56dbc 493
66f6e959 494=item * B<index : Private>
495
496C<index> is much like C<default> except that it takes no arguments
e178a66a 497and it is weighted slightly higher in the matching process. It is
498useful as a static entry point to a controller, e.g. to have a static
61a9002d 499welcome page. Note that it's also weighted higher than Path.
66f6e959 500
cda8d1ac 501=item * B<begin : Private>
fc7ec1d9 502
fc9c8698 503Called at the beginning of a request, before any matching actions are
504called.
fc7ec1d9 505
cda8d1ac 506=item * B<end : Private>
4a6895ce 507
fc7ec1d9 508Called at the end of a request, after all matching actions are called.
509
fc9c8698 510=back
511
6b10c72b 512=head4 Built-in actions in controllers/autochaining
fc7ec1d9 513
e178a66a 514 Package MyApp::Controller::Foo;
cda8d1ac 515 sub begin : Private { }
5a8ed4fe 516 sub default : Private { }
eff5f524 517 sub auto : Private { }
fc7ec1d9 518
fc9c8698 519You can define built-in private actions within your controllers as
520well. The actions will override the ones in less-specific controllers,
521or your application class. In other words, for each of the three
522built-in private actions, only one will be run in any request
e178a66a 523cycle. Thus, if C<MyApp::Controller::Catalog::begin> exists, it will be
524run in place of C<MyApp::begin> if you're in the C<catalog> namespace,
525and C<MyApp::Controller::Catalog::Order::begin> would override this in
526turn.
fc9c8698 527
eff5f524 528In addition to the normal built-in actions, you have a special action
529for making chains, C<auto>. Such C<auto> actions will be run after any
fc9c8698 530C<begin>, but before your action is processed. Unlike the other
eff5f524 531built-ins, C<auto> actions I<do not> override each other; they will be
532called in turn, starting with the application class and going through to
533the I<most> specific class. I<This is the reverse of the order in which
534the normal built-ins override each other>.
fc9c8698 535
536Here are some examples of the order in which the various built-ins
537would be called:
cda8d1ac 538
539=over 4
540
fc9c8698 541=item for a request for C</foo/foo>
cda8d1ac 542
543 MyApp::begin
80ef2e6d 544 MyApp::auto
e178a66a 545 MyApp::Controller::Foo::default # in the absence of MyApp::Controller::Foo::Foo
cda8d1ac 546 MyApp::end
547
fc9c8698 548=item for a request for C</foo/bar/foo>
cda8d1ac 549
e178a66a 550 MyApp::Controller::Foo::Bar::begin
80ef2e6d 551 MyApp::auto
e178a66a 552 MyApp::Controller::Foo::auto
553 MyApp::Controller::Foo::Bar::auto
554 MyApp::Controller::Foo::Bar::default # for MyApp::Controller::Foo::Bar::foo
555 MyApp::Controller::Foo::Bar::end
80ef2e6d 556
557=back
558
fc9c8698 559The C<auto> action is also distinguished by the fact that you can break
560out of the processing chain by returning 0. If an C<auto> action returns
5610, any remaining actions will be skipped, except for C<end>. So, for the
562request above, if the first auto returns false, the chain would look
563like this:
80ef2e6d 564
565=over 4
566
fc9c8698 567=item for a request for C</foo/bar/foo> where first C<auto> returns
568false
80ef2e6d 569
e178a66a 570 MyApp::Controller::Foo::Bar::begin
80ef2e6d 571 MyApp::auto
e178a66a 572 MyApp::Controller::Foo::Bar::end
cda8d1ac 573
574=back
4a6895ce 575
fc9c8698 576An example of why one might use this is an authentication action: you
577could set up a C<auto> action to handle authentication in your
578application class (which will always be called first), and if
579authentication fails, returning 0 would skip any remaining methods
580for that URL.
03805733 581
fc9c8698 582B<Note:> Looking at it another way, C<auto> actions have to return a
583true value to continue processing! You can also C<die> in the autochain
584action; in that case, the request will go straight to the finalize
585stage, without processing further actions.
03805733 586
6b10c72b 587=head4 URL Path Handling
4a6895ce 588
70d5ae49 589You can pass variable arguments as part of the URL path, separated with
590forward slashes (/). If the action is a Regex or LocalRegex, the '$' anchor
591must be used. For example, suppose you want to handle C</foo/$bar/$baz>,
592where C<$bar> and C<$baz> may vary:
4a6895ce 593
cda8d1ac 594 sub foo : Regex('^foo$') { my ($self, $context, $bar, $baz) = @_; }
4a6895ce 595
fc9c8698 596But what if you also defined actions for C</foo/boo> and C</foo/boo/hoo>?
4a6895ce 597
f29c48dd 598 sub boo : Path('foo/boo') { .. }
599 sub hoo : Path('foo/boo/hoo') { .. }
4a6895ce 600
601Catalyst matches actions in most specific to least specific order:
602
603 /foo/boo/hoo
604 /foo/boo
fc9c8698 605 /foo # might be /foo/bar/baz but won't be /foo/boo/hoo
4a6895ce 606
fc9c8698 607So Catalyst would never mistakenly dispatch the first two URLs to the
608'^foo$' action.
fc7ec1d9 609
70d5ae49 610If a Regex or LocalRegex action doesn't use the '$' anchor, the action will
611still match a URL containing arguments, however the arguments won't be
612available via C<@_>.
613
6b10c72b 614=head4 Parameter Processing
2ef2fb0f 615
fc9c8698 616Parameters passed in the URL query string are handled with methods in
617the L<Catalyst::Request> class. The C<param> method is functionally
618equivalent to the C<param> method of C<CGI.pm> and can be used in
619modules that require this.
2ef2fb0f 620
621 # http://localhost:3000/catalog/view/?category=hardware&page=3
622 my $category = $c->req->param('category');
623 my $current_page = $c->req->param('page') || 1;
624
625 # multiple values for single parameter name
626 my @values = $c->req->param('scrolling_list');
627
628 # DFV requires a CGI.pm-like input hash
629 my $results = Data::FormValidator->check($c->req->params, \%dfv_profile);
630
fc7ec1d9 631=head3 Flow Control
632
d08ced28 633You control the application flow with the C<forward> method, which
634accepts the key of an action to execute. This can be an action in the
635same or another Catalyst controller, or a Class name, optionally
636followed by a method name. After a C<forward>, the control flow will
637return to the method from which the C<forward> was issued.
638
639A C<forward> is similar to a method call. The main differences are that
640it wraps the call in an C<eval> to allow exception handling; it
641automatically passes along the context object (C<$c> or C<$context>);
642and it allows profiling of each call (displayed in the log with
643debugging enabled).
fc7ec1d9 644
e3dc9d78 645 sub hello : Global {
5a8ed4fe 646 my ( $self, $c ) = @_;
647 $c->stash->{message} = 'Hello World!';
d08ced28 648 $c->forward('check_message'); # $c is automatically included
5a8ed4fe 649 }
fc7ec1d9 650
4c6807d2 651 sub check_message : Private {
5a8ed4fe 652 my ( $self, $c ) = @_;
653 return unless $c->stash->{message};
4c6807d2 654 $c->forward('show_message');
5a8ed4fe 655 }
fc7ec1d9 656
4c6807d2 657 sub show_message : Private {
5a8ed4fe 658 my ( $self, $c ) = @_;
66f6e959 659 $c->res->body( $c->stash->{message} );
5a8ed4fe 660 }
3323f920 661
d08ced28 662A C<forward> does not create a new request, so your request
663object (C<$c-E<gt>req>) will remain unchanged. This is a
664key difference between using C<forward> and issuing a
665redirect.
3323f920 666
d08ced28 667You can pass new arguments to a C<forward> by adding them
668in an anonymous array. In this case C<$c-E<gt>req-E<gt>args>
669will be changed for the duration of the C<forward> only; upon
670return, the original value of C<$c-E<gt>req-E<gt>args> will
671be reset.
3323f920 672
673 sub hello : Global {
674 my ( $self, $c ) = @_;
675 $c->stash->{message} = 'Hello World!';
d08ced28 676 $c->forward('check_message',[qw/test1/]);
677 # now $c->req->args is back to what it was before
3323f920 678 }
679
d08ced28 680 sub check_message : Private {
681 my ( $self, $c ) = @_;
fabf3a10 682 my $first_argument = $c->req->args->[0]; # now = 'test1'
d08ced28 683 # do something...
684 }
b248fa4a 685
d08ced28 686As you can see from these examples, you can just use the method name as
687long as you are referring to methods in the same controller. If you want
688to forward to a method in another controller, or the main application,
689you will have to refer to the method by absolute path.
cda8d1ac 690
691 $c->forward('/my/controller/action');
d08ced28 692 $c->forward('/default'); # calls default in main application
fc7ec1d9 693
d08ced28 694Here are some examples of how to forward to classes and methods.
fc7ec1d9 695
e3dc9d78 696 sub hello : Global {
5a8ed4fe 697 my ( $self, $c ) = @_;
e178a66a 698 $c->forward(qw/MyApp::Model::Hello say_hello/);
5a8ed4fe 699 }
fc7ec1d9 700
e3dc9d78 701 sub bye : Global {
5a8ed4fe 702 my ( $self, $c ) = @_;
e178a66a 703 $c->forward('MyApp::Model::Hello'); # no method: will try 'process'
5a8ed4fe 704 }
fc7ec1d9 705
e178a66a 706 package MyApp::Model::Hello;
fc7ec1d9 707
708 sub say_hello {
709 my ( $self, $c ) = @_;
66f6e959 710 $c->res->body('Hello World!');
fc7ec1d9 711 }
712
713 sub process {
714 my ( $self, $c ) = @_;
66f6e959 715 $c->res->body('Goodbye World!');
fc7ec1d9 716 }
717
d08ced28 718Note that C<forward> returns to the calling action and continues
13436c14 719processing after the action finishes. If you want all further processing
720in the calling action to stop, use C<detach> instead, which will execute
721the C<detach>ed action and not return to the calling sub. In both cases,
722Catalyst will automatically try to call process() if you omit the
723method.
fc7ec1d9 724
725=head3 Components
726
56d8daeb 727Catalyst has an uncommonly flexible component system. You can define as
cccc887d 728many L</Models>, L</Views>, and L</Controllers> as you like.
fc7ec1d9 729
56d8daeb 730All components must inherit from L<Catalyst::Base>, which provides a
731simple class structure and some common class methods like C<config> and
732C<new> (constructor).
fc7ec1d9 733
e178a66a 734 package MyApp::Controller::Catalog;
fc7ec1d9 735
736 use strict;
737 use base 'Catalyst::Base';
738
739 __PACKAGE__->config( foo => 'bar' );
740
741 1;
742
6b10c72b 743You don't have to C<use> or otherwise register Models, Views, and
744Controllers. Catalyst automatically discovers and instantiates them
745when you call C<setup> in the main application. All you need to do is
746put them in directories named for each Component type. Notice that you
747can use some very terse aliases for each one.
fc7ec1d9 748
749=over 4
750
4a6895ce 751=item * B<MyApp/Model/>
fc7ec1d9 752
4a6895ce 753=item * B<MyApp/M/>
fc7ec1d9 754
4a6895ce 755=item * B<MyApp/View/>
fc7ec1d9 756
4a6895ce 757=item * B<MyApp/V/>
fc7ec1d9 758
4a6895ce 759=item * B<MyApp/Controller/>
fc7ec1d9 760
4a6895ce 761=item * B<MyApp/C/>
fc7ec1d9 762
763=back
764
765=head4 Views
766
129cfe74 767To show how to define views, we'll use an already-existing base class for the
768L<Template Toolkit|Template>, L<Catalyst::View::TT>. All we need to do is
769inherit from this class:
fc7ec1d9 770
e178a66a 771 package MyApp::View::TT;
fc7ec1d9 772
773 use strict;
774 use base 'Catalyst::View::TT';
775
776 1;
777
b33ed88c 778(You can also generate this automatically by using the helper script:
779
780 script/myapp_create.pl view TT TT
781
fb9257c1 782where the first C<TT> tells the script that the name of the view should
783be C<TT>, and the second that it should be a Template Toolkit view.)
b33ed88c 784
129cfe74 785This gives us a process() method and we can now just do
e178a66a 786$c->forward('MyApp::View::TT') to render our templates. The base class
787makes process() implicit, so we don't have to say
788C<$c-E<gt>forward(qw/MyApp::View::TT process/)>.
fc7ec1d9 789
e3dc9d78 790 sub hello : Global {
5a8ed4fe 791 my ( $self, $c ) = @_;
792 $c->stash->{template} = 'hello.tt';
793 }
fc7ec1d9 794
5a8ed4fe 795 sub end : Private {
796 my ( $self, $c ) = @_;
e178a66a 797 $c->forward('MyApp::View::TT');
5a8ed4fe 798 }
fc7ec1d9 799
6b10c72b 800You normally render templates at the end of a request, so it's a perfect
801use for the global C<end> action.
fc7ec1d9 802
129cfe74 803Also, be sure to put the template under the directory specified in
6b10c72b 804C<$c-E<gt>config-E<gt>{root}>, or you'll be forced to look at our
805eyecandy debug screen. ;)
fc7ec1d9 806
807=head4 Models
808
e178a66a 809To show how to define models, again we'll use an already-existing base
e112461a 810class, this time for L<DBIx::Class>: L<Catalyst::Model::DBIC::Schema>.
811We'll also need L<DBIx::Class::Schema::Loader>.
fc7ec1d9 812
813But first, we need a database.
814
815 -- myapp.sql
816 CREATE TABLE foo (
817 id INTEGER PRIMARY KEY,
818 data TEXT
819 );
820
821 CREATE TABLE bar (
822 id INTEGER PRIMARY KEY,
823 foo INTEGER REFERENCES foo,
824 data TEXT
825 );
826
827 INSERT INTO foo (data) VALUES ('TEST!');
828
829
830 % sqlite /tmp/myapp.db < myapp.sql
831
e112461a 832Now we can create a DBIC::SchemaLoader component for this database.
fc7ec1d9 833
e112461a 834 script/myapp_create.pl model DBIC DBIC::SchemaLoader 'dbi:SQLite:/tmp/myapp.db'
fc7ec1d9 835
e112461a 836L<DBIx::Class::Schema::Loader> automatically loads table layouts and
837relationships. Use the stash to pass data to your templates.
fc7ec1d9 838
e112461a 839We add the following to MyApp/Controller/Root.pm
b248fa4a 840
e112461a 841 sub view : Global {
842 my ( $self, $c, $id ) = @_;
843
844 $c->stash->{item} = $c->model('DBIC::Foo')->find($id);
845 }
fc7ec1d9 846
e112461a 847 1;
848
5a8ed4fe 849 sub end : Private {
850 my ( $self, $c ) = @_;
e112461a 851
5a8ed4fe 852 $c->stash->{template} ||= 'index.tt';
e112461a 853 $c->forward( $c->view('TT') );
5a8ed4fe 854 }
fc7ec1d9 855
e112461a 856We then create a new template file "root/index.tt" containing:
fc7ec1d9 857
e112461a 858 The Id's data is [% item.data %]
fc7ec1d9 859
6b10c72b 860Models do not have to be part of your Catalyst application; you
861can always call an outside module that serves as your Model:
862
863 # in a Controller
864 sub list : Local {
865 my ( $self, $c ) = @_;
e112461a 866
6b10c72b 867 $c->stash->{template} = 'list.tt';
e112461a 868
869 use Some::Outside::DBIC::Module;
870 my @records = Some::Outside::DBIC::Module->search({
871 artist => 'sri',
872 });
873
6b10c72b 874 $c->stash->{records} = \@records;
875 }
876
877But by using a Model that is part of your Catalyst application, you gain
878several things: you don't have to C<use> each component, Catalyst will
879find and load it automatically at compile-time; you can C<forward> to
26e73131 880the module, which can only be done to Catalyst components; and only
6b10c72b 881Catalyst components can be fetched with
e178a66a 882C<$c-E<gt>model('SomeModel')>.
6b10c72b 883
884Happily, since many people have existing Model classes that they
885would like to use with Catalyst (or, conversely, they want to
886write Catalyst models that can be used outside of Catalyst, e.g.
887in a cron job), it's trivial to write a simple component in
888Catalyst that slurps in an outside Model:
889
e112461a 890 package MyApp::Model::DB;
891 use base qw/Catalyst::Model::DBIC::Schema/;
892 __PACKAGE__->config(
893 schema_class => 'Some::DBIC::Schema',
cccc887d 894 connect_info => ['dbi:SQLite:foo.db', '', '', {AutoCommit=>1}]
e112461a 895 );
6b10c72b 896 1;
897
e112461a 898and that's it! Now C<Some::DBIC::Schema> is part of your
899Cat app as C<MyApp::Model::DB>.
6b10c72b 900
fc7ec1d9 901=head4 Controllers
902
129cfe74 903Multiple controllers are a good way to separate logical domains of your
904application.
fc7ec1d9 905
e178a66a 906 package MyApp::Controller::Login;
fc7ec1d9 907
c02f7490 908 use base qw/Catalyst::Controller/;
909
910 sub sign_in : Path("sign-in") { }
911 sub new_password : Path("new-password") { }
912 sub sign_out : Path("sign-out") { }
fc7ec1d9 913
e178a66a 914 package MyApp::Controller::Catalog;
fc7ec1d9 915
c02f7490 916 use base qw/Catalyst::Controller/;
917
e3dc9d78 918 sub view : Local { }
919 sub list : Local { }
fc7ec1d9 920
e178a66a 921 package MyApp::Controller::Cart;
fc7ec1d9 922
c02f7490 923 use base qw/Catalyst::Controller/;
924
e3dc9d78 925 sub add : Local { }
926 sub update : Local { }
927 sub order : Local { }
fc7ec1d9 928
c02f7490 929Note that you can also supply attributes via the Controller's config so long
930as you have at least one attribute on a subref to be exported (:Action is
931commonly used for this) - for example the following is equivalent to the same
932controller above
933
934 package MyApp::Controller::Login;
935
936 use base qw/Catalyst::Controller/;
937
938 __PACKAGE__->config(
939 actions => {
940 'sign_in' => { Path => 'sign-in' },
941 'new_password' => { Path => 'new-password' },
942 'sign_out' => { Path => 'sign-out' },
943 },
944 );
945
946 sub sign_in : Action { }
947 sub new_password : Action { }
948 sub sign_out : Action { }
949
24cda51b 950=head3 Models
951
952Models are providers of data. This data could come from anywhere - a search
953engine index, a database table, etc. Typically the data source does not have
954much to do with web applications or Catalyst - it could be used to write an
955offline report generator or a command line tool just the same.
956
957The common approach to writing a Catalyst-style model for your application is
958wrapping a generic model (e.g. L<DBIx::Class::Schema>, a bunch of XMLs, or
959anything really) with an object that contains configuration data, convenience
960methods, and so forth.
961
962#### editor: move this part to =head3 Components somehow, right after this
963#### section - this will require deeply rephrasing this paragraph.
964
965Technically, within Catalyst a model is a B<component> - an instance of the
966model's class belonging to the application. It is important to stress that the
967lifetime of these objects is per application, not per request.
968
969While the model base class (L<Catalyst::Model>) provides things like C<config>
970and stuff to better integrate the model into the application, sometimes this is
971not enough, and the model requires access to C<$c> itself.
972
973Situations where this need might arise include:
974
975=over 4
976
977=item *
978
979Interacting with another model
980
981=item *
982
983Using per-request data to control behavior
984
985=item *
986
987Using plugins in (for example L<Catalyst::Plugin::Cache>).
988
989=back
990
991From a style perspective usually it's bad to make your model "too smart" about
992things - it should worry about business logic and leave the integration details
993to the controllers. If, however, you find that it does not make sense at all to
994use an auxillary controller around the model, and the model's need to access
995C<$c> cannot be sidestepped, there exists a power tool called C<ACCEPT_CONTEXT>.
996
997#### editor note: this part is "generic" - it also applies to views and
998#### controllers.
999
1000=head3 ACCEPT_CONTEXT
1001
1002Whenever you call $c->component("Foo") you get back an object - the instance of
1003the model. If the component supports the C<ACCEPT_CONTEXT> method instead of
1004returning the model itself, the return value of
1005C<< $model->ACCEPT_CONTEXT( $c ) >> will be used.
1006
1007This means that whenever your model/view/controller needs to talk to C<$c> it
1008gets a chance to do this when it's needed.
1009
1010A typical C<ACCEPT_CONTEXT> method will either clone the model and return one
1011with the context object set, or it will return a thin wrapper that contains
1012C<$c> and delegates to the per-application model object.
1013
1014A typicall C<ACCEPT_CONTEXT> method could look like this:
1015
1016 sub ACCEPT_CONTEXT {
1017 my ( $self, $c, @extra_arguments ) = @_;
1018 bless { %$self, c => $c }, ref($self);
1019 }
1020
1021effectively treating $self as a B<prototype object> that gets a new parameter.
1022C<@extra_arguments> comes from any trailing arguments to
1023C<< $c->component( $bah, @extra_arguments ) >> (or C<< $c->model(...) >>,
1024C<< $c->view(...) >> etc).
1025
1026The life time of this value is B<per usage>, and not per request. To make this
1027per request you can use the following technique:
1028
1029Add a field to C<$c>, like C<my_model_instance>. Then write your
1030C<ACCEPT_CONTEXT> method to look like this:
1031
1032 sub ACCEPT_CONTEXT {
1033 my ( $self, $c ) = @_;
1034
1035 if ( my $per_request = $c->my_model_instance ) {
1036 return $per_request;
1037 } else {
1038 my $new_instance = bless { %$self, c => $c }, ref($self);
1039 Scalar::Util::weaken($new_instance->{c}); # or we have a circular reference
1040 $c->my_model_instance( $new_instance );
1041 return $new_instance;
1042 }
1043 }
1044
1045
1046
fc7ec1d9 1047=head3 Testing
1048
e178a66a 1049Catalyst has a built-in http server for testing! (Later, you can easily
1050use a more powerful server, e.g. Apache/mod_perl, in a production
1051environment.)
fc7ec1d9 1052
1053Start your application on the command line...
1054
b33ed88c 1055 script/myapp_server.pl
fc7ec1d9 1056
1057...then visit http://localhost:3000/ in a browser to view the output.
1058
1059You can also do it all from the command line:
1060
b33ed88c 1061 script/myapp_test.pl http://localhost/
fc7ec1d9 1062
1063Have fun!
1064
3cb1db8c 1065=head1 SUPPORT
1066
1067IRC:
1068
1069 Join #catalyst on irc.perl.org.
1070
72d9bfc7 1071Mailing-lists:
3cb1db8c 1072
1073 http://lists.rawmode.org/mailman/listinfo/catalyst
1074 http://lists.rawmode.org/mailman/listinfo/catalyst-dev
1075
fc7ec1d9 1076=head1 AUTHOR
1077
cda8d1ac 1078Sebastian Riedel, C<sri@oook.de>
1079David Naughton, C<naughton@umn.edu>
1080Marcus Ramberg, C<mramberg@cpan.org>
f531dd37 1081Jesse Sheidlower, C<jester@panix.com>
129cfe74 1082Danijel Milicevic, C<me@danijel.de>
c37916b0 1083Kieren Diment, C<kd@totaldatasolution.com>
24cda51b 1084Yuval Kogman, C<nothingmuch@woobling.org>
fc7ec1d9 1085
1086=head1 COPYRIGHT
1087
aa2b0d97 1088This program is free software, you can redistribute it and/or modify it
1089under the same terms as Perl itself.