Extended Intro with some ChildOf details
[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>.
6c5c02ba 11For a systematic step-by-step introduction to writing an application
12with Catalyst, see L<Catalyst::Manual::Tutorial>.
fc7ec1d9 13
14=head2 What is Catalyst?
15
129cfe74 16Catalyst is an elegant web application framework, extremely flexible yet
56d8daeb 17extremely simple. It's similar to Ruby on Rails, Spring (Java), and
6c5c02ba 18L<Maypole>, upon which it was originally based. Its most important
19design philosphy is to provide easy access to all the tools you need to
20develop web applications, with few restrictions on how you need to use
21these tools. Under Catalyst, it is always possible to do things in a
22different way. However, this does mean that it is always possible to do
23things in a different way. Other web frameworks are simpler to use and
24easy to get up and running, but achieve this by locking the programmer
25into a single set of tools. Catalyst's emphasis on flexibility means
26that you have to think more to use it. We view this as a feature.
fc7ec1d9 27
28=head3 MVC
29
e178a66a 30Catalyst follows the Model-View-Controller (MVC) design pattern,
31allowing you to easily separate concerns, like content, presentation,
32and flow control, into separate modules. This separation allows you to
33modify code that handles one concern without affecting code that handles
34the others. Catalyst promotes the re-use of existing Perl modules that
35already handle common web application concerns well.
fc7ec1d9 36
e178a66a 37Here's how the M, V, and C map to those concerns, with examples of
38well-known Perl modules you may want to use for each.
fc7ec1d9 39
40=over 4
41
4a6895ce 42=item * B<Model>
fc7ec1d9 43
e112461a 44Access and modify content (data). L<DBIx::Class>, L<Class::DBI>,
6c5c02ba 45L<Xapian>, L<Net::LDAP>...
fc7ec1d9 46
4a6895ce 47=item * B<View>
fc7ec1d9 48
e178a66a 49Present content to the user. L<Template Toolkit|Template>,
50L<Mason|HTML::Mason>, L<HTML::Template>...
fc7ec1d9 51
4a6895ce 52=item * B<Controller>
fc7ec1d9 53
129cfe74 54Control the whole request phase, check parameters, dispatch actions, flow
56d8daeb 55control. Catalyst itself!
fc7ec1d9 56
57=back
58
d4ef4999 59If you're unfamiliar with MVC and design patterns, you may want to
60check out the original book on the subject, I<Design Patterns>, by
61Gamma, Helm, Johnson, and Vlissides, also known as the Gang of Four
62(GoF). Many, many web application frameworks are based on MVC, which
63is becoming a popular design method for web applications.
fc7ec1d9 64
65=head3 Flexibility
66
e178a66a 67Catalyst is much more flexible than many other frameworks. We'll talk
68more about this later, but rest assured you can use your favorite Perl
69modules with Catalyst.
fc7ec1d9 70
71=over 4
72
72d9bfc7 73=item * B<Multiple Models, Views, and Controllers>
fc7ec1d9 74
e178a66a 75To build a Catalyst application, you handle each type of concern inside
76special modules called L</Components>. Often this code will be very
77simple, just calling out to Perl modules like those listed above under
78L</MVC>. Catalyst handles these components in a very flexible way. Use
79as many Models, Views, and Controllers as you like, using as many
80different Perl modules as you like, all in the same application. Want to
81manipulate multiple databases, and retrieve some data via LDAP? No
82problem. Want to present data from the same Model using L<Template
83Toolkit|Template> and L<PDF::Template>? Easy.
fc7ec1d9 84
cda8d1ac 85=item * B<Reuseable Components>
fc7ec1d9 86
e178a66a 87Not only does Catalyst promote the re-use of already existing Perl
88modules, it also allows you to re-use your Catalyst components in
89multiple Catalyst applications.
fc7ec1d9 90
4a6895ce 91=item * B<Unrestrained URL-to-Action Dispatching>
fc7ec1d9 92
cccc887d 93Catalyst allows you to dispatch any URLs to any application L</Actions>,
e178a66a 94even through regular expressions! Unlike most other frameworks, it
95doesn't require mod_rewrite or class and method names in URLs.
fc7ec1d9 96
e178a66a 97With Catalyst you register your actions and address them directly. For
98example:
fc7ec1d9 99
e3dc9d78 100 sub hello : Global {
fc7ec1d9 101 my ( $self, $context ) = @_;
66f6e959 102 $context->response->body('Hello World!');
5a8ed4fe 103 }
fc7ec1d9 104
105Now http://localhost:3000/hello prints "Hello World!".
106
4a6895ce 107=item * B<Support for CGI, mod_perl, Apache::Request>
fc7ec1d9 108
109Use L<Catalyst::Engine::Apache> or L<Catalyst::Engine::CGI>.
110
111=back
112
113=head3 Simplicity
114
e178a66a 115The best part is that Catalyst implements all this flexibility in a very
116simple way.
fc7ec1d9 117
6f4e1683 118=over 4
119
4a6895ce 120=item * B<Building Block Interface>
fc7ec1d9 121
e178a66a 122Components interoperate very smoothly. For example, Catalyst
cccc887d 123automatically makes a L</Context> object available to every
e178a66a 124component. Via the context, you can access the request object, share
125data between components, and control the flow of your
126application. Building a Catalyst application feels a lot like snapping
129cfe74 127together toy building blocks, and everything just works.
fc7ec1d9 128
4a6895ce 129=item * B<Component Auto-Discovery>
fc7ec1d9 130
e178a66a 131No need to C<use> all of your components. Catalyst automatically finds
132and loads them.
fc7ec1d9 133
4a6895ce 134=item * B<Pre-Built Components for Popular Modules>
fc7ec1d9 135
e112461a 136See L<Catalyst::Model::DBIC::Schema> for L<DBIx::Class>, or
137L<Catalyst::View::TT> for L<Template Toolkit|Template>.
fc7ec1d9 138
72d9bfc7 139=item * B<Built-in Test Framework>
fc7ec1d9 140
e178a66a 141Catalyst comes with a built-in, lightweight http server and test
142framework, making it easy to test applications from the command line.
fc7ec1d9 143
4a6895ce 144=item * B<Helper Scripts>
fc7ec1d9 145
e178a66a 146Catalyst provides helper scripts to quickly generate running starter
147code for components and unit tests. See L<Catalyst::Helper>.
fc7ec1d9 148
6f4e1683 149=back
150
fc7ec1d9 151=head2 Quickstart
152
e178a66a 153Here's how to install Catalyst and get a simple application up and
154running, using the helper scripts described above.
fc7ec1d9 155
156=head3 Install
157
d538823f 158 $ perl -MCPAN -e 'install Task::Catalyst'
fc7ec1d9 159
160=head3 Setup
161
2feb6632 162 $ catalyst.pl MyApp
b33ed88c 163 # output omitted
2feb6632 164 $ cd MyApp
ac4a0ae0 165 $ script/myapp_create.pl controller Library::Login
fc7ec1d9 166
167=head3 Run
168
b33ed88c 169 $ script/myapp_server.pl
fc7ec1d9 170
129cfe74 171Now visit these locations with your favorite browser or user agent to see
172Catalyst in action:
fc7ec1d9 173
51aec62b 174(NOTE: Although we create a controller here, we don't actually use it.
175Both of these URLs should take you to the welcome page.)
176
177
fc7ec1d9 178=over 4
179
180=item http://localhost:3000/
181
ac4a0ae0 182=item http://localhost:3000/library/login/
fc7ec1d9 183
184=back
185
56d8daeb 186Easy!
fc7ec1d9 187
188=head2 How It Works
189
e178a66a 190Let's see how Catalyst works, by taking a closer look at the components
191and other parts of a Catalyst application.
fc7ec1d9 192
193=head3 Application Class
194
e178a66a 195In addition to the Model, View, and Controller components, there's a
196single class that represents your application itself. This is where you
c37916b0 197configure your application, load plugins, and extend Catalyst.
fc7ec1d9 198
199 package MyApp;
200
201 use strict;
202 use Catalyst qw/-Debug/;
203
204 MyApp->config(
205 name => 'My Application',
fc7ec1d9 206
b33ed88c 207 # You can put anything else you want in here:
208 my_configuration_variable => 'something',
fc7ec1d9 209 );
fc7ec1d9 210 1;
211
6c5c02ba 212In older versions of Catalyst, the application class was where you put
213global actions. However, as of version 5.66, the recommended practice is
214to place such actions in a special Root controller (see #####, below),
215to avoid namespace collisions.
216
fc7ec1d9 217=over 4
218
4a6895ce 219=item * B<name>
fc7ec1d9 220
56d8daeb 221The name of your application.
fc7ec1d9 222
fc7ec1d9 223=back
224
e178a66a 225Optionally, you can specify a B<root> parameter for templates and static
226data. If omitted, Catalyst will try to auto-detect the directory's
227location. You can define as many parameters as you want for plugins or
228whatever you need. You can access them anywhere in your application via
229C<$context-E<gt>config-E<gt>{$param_name}>.
fc7ec1d9 230
6c5c02ba 231###### We need a short section on configuration here.
232
fc7ec1d9 233=head3 Context
234
e178a66a 235Catalyst automatically blesses a Context object into your application
236class and makes it available everywhere in your application. Use the
cccc887d 237Context to directly interact with Catalyst and glue your L</Components>
e178a66a 238together. For example, if you need to use the Context from within a
239Template Toolkit template, it's already there:
c42f5bbf 240
241 <h1>Welcome to [% c.config.name %]!</h1>
fc7ec1d9 242
e178a66a 243As illustrated in our URL-to-Action dispatching example, the Context is
244always the second method parameter, behind the Component object
245reference or class name itself. Previously we called it C<$context> for
246clarity, but most Catalyst developers just call it C<$c>:
fc7ec1d9 247
e3dc9d78 248 sub hello : Global {
fc7ec1d9 249 my ( $self, $c ) = @_;
66f6e959 250 $c->res->body('Hello World!');
5a8ed4fe 251 }
fc7ec1d9 252
253The Context contains several important objects:
254
255=over 4
256
257=item * L<Catalyst::Request>
258
259 $c->request
260 $c->req # alias
261
129cfe74 262The request object contains all kinds of request-specific information, like
263query parameters, cookies, uploads, headers, and more.
fc7ec1d9 264
265 $c->req->params->{foo};
266 $c->req->cookies->{sessionid};
267 $c->req->headers->content_type;
268 $c->req->base;
269
afdca3a3 270=item * L<Catalyst::Response>
fc7ec1d9 271
272 $c->response
273 $c->res # alias
274
129cfe74 275The response is like the request, but contains just response-specific
276information.
fc7ec1d9 277
66f6e959 278 $c->res->body('Hello World');
fc7ec1d9 279 $c->res->status(404);
280 $c->res->redirect('http://oook.de');
281
282=item * L<Catalyst::Config>
283
284 $c->config
fc7ec1d9 285 $c->config->root;
286 $c->config->name;
287
288=item * L<Catalyst::Log>
289
290 $c->log
fc7ec1d9 291 $c->log->debug('Something happened');
292 $c->log->info('Something you should know');
293
4a6895ce 294=item * B<Stash>
fc7ec1d9 295
296 $c->stash
fc7ec1d9 297 $c->stash->{foo} = 'bar';
d4ef4999 298 $c->stash->{baz} = {baz => 'qox'};
299 $c->stash->{fred} = [qw/ wilma pebbles/];
300
301and so on.
fc7ec1d9 302
303=back
304
129cfe74 305The last of these, the stash, is a universal hash for sharing data among
306application components. For an example, we return to our 'hello' action:
fc7ec1d9 307
e3dc9d78 308 sub hello : Global {
5a8ed4fe 309 my ( $self, $c ) = @_;
310 $c->stash->{message} = 'Hello World!';
4c6807d2 311 $c->forward('show_message');
5a8ed4fe 312 }
fc7ec1d9 313
4c6807d2 314 sub show_message : Private {
5a8ed4fe 315 my ( $self, $c ) = @_;
66f6e959 316 $c->res->body( $c->stash->{message} );
5a8ed4fe 317 }
fc7ec1d9 318
e178a66a 319Note that the stash should be used only for passing data in an
320individual request cycle; it gets cleared at a new request. If you need
321to maintain more persistent data, use a session.
dd25a192 322
fc7ec1d9 323=head3 Actions
324
56d8daeb 325A Catalyst controller is defined by its actions. An action is a
326subroutine with a special attribute. You've already seen some examples
327of actions in this document. The URL (for example
328http://localhost.3000/foo/bar) consists of two parts, the base
329(http://localhost:3000/ in this example) and the path (foo/bar). Please
330note that the trailing slash after the hostname[:port] always belongs to
331base and not to the action.
cda8d1ac 332
c37916b0 333=over 4
334
335=item * B<Application Wide Actions>
336
337Actions which are called at the root level of the application
6c5c02ba 338(e.g. http://localhost:3000/ ) go in MyApp::Controller::Root, like
c37916b0 339this:
340
341 package MyApp::Controller::Root;
342 use base 'Catalyst::Controller';
343 # Sets the actions in this controller to be registered with no prefix
344 # so they function identically to actions created in MyApp.pm
345 __PACKAGE__->config->{namespace} = '';
346 sub default : Private {
347 my ( $self, $context ) = @_;
348 $context->response->body('Catalyst rocks!');
349 }
350 1;
351
352
353=back
354
355For most applications, Catalyst requires you to define only one config
356parameter:
357
358=head4 Action types
359
cda8d1ac 360Catalyst supports several types of actions:
fc7ec1d9 361
362=over 4
363
56d8daeb 364=item * B<Literal> (B<Path> actions)
fc7ec1d9 365
e178a66a 366 package MyApp::Controller::My::Controller;
f29c48dd 367 sub bar : Path('foo/bar') { }
fc7ec1d9 368
e178a66a 369Literal C<Path> actions will act relative to their current
370namespace. The above example matches only
371http://localhost:3000/my/controller/foo/bar. If you start your path with
372a forward slash, it will match from the root. Example:
0cf56dbc 373
e178a66a 374 package MyApp::Controller::My::Controller;
0cf56dbc 375 sub bar : Path('/foo/bar') { }
376
fc7ec1d9 377Matches only http://localhost:3000/foo/bar.
378
e178a66a 379 package MyApp::Controller::My::Controller;
0cf56dbc 380 sub bar : Path { }
381
e178a66a 382By leaving the C<Path> definition empty, it will match on the namespace
383root. The above code matches http://localhost:3000/my/controller.
0cf56dbc 384
4a6895ce 385=item * B<Regex>
fc7ec1d9 386
b33ed88c 387 sub bar : Regex('^item(\d+)/order(\d+)$') { }
fc7ec1d9 388
129cfe74 389Matches any URL that matches the pattern in the action key, e.g.
e178a66a 390http://localhost:3000/item23/order42. The '' around the regexp is
391optional, but perltidy likes it. :)
b33ed88c 392
e178a66a 393Regex matches act globally, i.e. without reference to the namespace from
394which it is called, so that a C<bar> method in the
395C<MyApp::Controller::Catalog::Order::Process> namespace won't match any
396form of C<bar>, C<Catalog>, C<Order>, or C<Process> unless you
397explicitly put this in the regex. To achieve the above, you should
398consider using a C<LocalRegex> action.
66f6e959 399
400=item * B<LocalRegex>
401
402 sub bar : LocalRegex('^widget(\d+)$') { }
fc7ec1d9 403
66f6e959 404LocalRegex actions act locally. If you were to use C<bar> in
0cf56dbc 405C<MyApp::Controller::Catalog>, the above example would match urls like
406http://localhost:3000/catalog/widget23.
407
e178a66a 408If you omit the "C<^>" from your regex, then it will match any depth
409from the controller and not immediately off of the controller name. The
410following example differs from the above code in that it will match
0cf56dbc 411http://localhost:3000/catalog/foo/widget23 as well.
412
413 package MyApp::Controller::Catalog;
414 sub bar : LocalRegex('widget(\d+)$') { }
66f6e959 415
e178a66a 416For both LocalRegex and Regex actions, if you use capturing parentheses
417to extract values within the matching URL, those values are available in
2982e768 418the C<$c-E<gt>req-E<gt>captures> array. In the above example, "widget23"
e178a66a 419would capture "23" in the above example, and
2982e768 420C<$c-E<gt>req-E<gt>captures-E<gt>[0]> would be "23". If you want to pass
e178a66a 421arguments at the end of your URL, you must use regex action keys. See
422L</URL Path Handling> below.
fc7ec1d9 423
e76c67cb 424=item * B<ChildOf>
425
426 sub section :PathPart('section') :ChildOf('/') :Captures(1) { }
427
428ChildOf is a powerful way to handle canonical URIs of the form
429/section/1/item/2
430
431Taking the above URI as an example in Controller::Root you can do the following :-
432
08141496 433 sub section_handler :PathPart('section') :ChildOf('/') :Captures(1) {
434 my ( $self, $c ) = @_;
435 $c->stash->{'section'} =
436 $c->Model('Sections')->find($c->req->captures->[0]);
437 }
438
439 sub item_handler :PathPart('item') :ChildOf('/section_handler') :Args(1) {
440 my ( $self, $c ) = @_;
441 $c->stash->{'item'} =
442 $c->stash->{'section'}->find_related('item',$c->args->[0]);
443 }
e76c67cb 444
445The subroutine section_handler matched the path segment 'section' as a child of '/'. It
446then took the next path segment, as referenced by :Captures(1) and stashed it in the
447arrayref $c->req->captures. Since there was also a child of this handler - it also gets run.
448The same rules apply here - This time however it has the 'Args' attribute which means
449this particular routine will run if there is exactly 1 argument. See Args below for more
450options.
451
08141496 452It is not important in which controller or on which namespace level a parent action is.
453Also, there can be more than one action using another one as parent by specifying C<ChildOf>.
454
e76c67cb 455=item ChildOf('xyz')
456
457The action of the parent - for instance, if you have method item_handler in controller
458SuperMarket::Aisle, the action would be /supermarket/aisle/item_handler. For a root handler
08141496 459this would be '/'. For an action in the same controller namespace you can use a relative
460name like C<:ChildOf('foo')>.
e76c67cb 461
462=item PathPart('xyz')
463
08141496 464The name of this path section in the ChildOf tree mapping to the URI. If you specify
465C<:PathPart> without arguments, it takes the name of the action specifying the argument.
466For example, these two declarations have the same effect:
467
468 sub foo :PathPart('foo') :ChildOf('bar') :Args(1) {
469 ...
470 }
471
472and
473
474 sub foo :PathPart :ChildOf('bar') :Args(1) {
475 ...
476 }
477
478The value can also contain a slash, for example:
479
480 sub baz :PathPart('bar/baz') :ChildOf('/') :Captures(1) {
481 ...
482 }
483
484would be involved in matches on C</bar/baz/*/...> paths.
e76c67cb 485
486=item Captures(int)
487
488Will 'collapse' the next x path segments in the request URI and push them into
08141496 489the arrayref $c->req->captures. An action specifying C<Captures> is thought to
490be used as target for C<ChildOf> specifications. Also see the C<Args> attribute
491below, which is used for endpoints.
e76c67cb 492
493=item Args(int)
494
495The number of path segments to capture at the end of a request URI. This *must* be
496included in your leaf nodes. You can use Args(0) for an equivalent of the index
497action.
498Args with no parameters will capture every postfixed segment into $c->req->args.
499
08141496 500A specification of C<Args> is seen as endpoint in regard to an additional
501C<ChildOf> specification.
502
56d8daeb 503=item * B<Top-level> (B<Global>)
cda8d1ac 504
c37916b0 505 package MyApp::Controller::Foo;
cda8d1ac 506 sub foo : Global { }
507
c37916b0 508Matches http://localhost:3000/foo. The function name is mapped
509directly to the application base. You can provide an equivalent
510function in this case by doing the following:
511
512 package MyApp::Controller::Root
513 sub foo : Local { }
cda8d1ac 514
56d8daeb 515=item * B<Namespace-Prefixed> (B<Local>)
fc7ec1d9 516
e178a66a 517 package MyApp::Controller::My::Controller;
e3dc9d78 518 sub foo : Local { }
fc7ec1d9 519
cda8d1ac 520Matches http://localhost:3000/my/controller/foo.
fc7ec1d9 521
129cfe74 522This action type indicates that the matching URL must be prefixed with a
e178a66a 523modified form of the component's class (package) name. This modified
524class name excludes the parts that have a pre-defined meaning in
525Catalyst ("MyApp::Controller" in the above example), replaces "::" with
526"/", and converts the name to lower case. See L</Components> for a full
527explanation of the pre-defined meaning of Catalyst component class
528names.
fc7ec1d9 529
4a6895ce 530=item * B<Private>
fc7ec1d9 531
5a8ed4fe 532 sub foo : Private { }
fc7ec1d9 533
e178a66a 534Matches no URL, and cannot be executed by requesting a URL that
535corresponds to the action key. Private actions can be executed only
536inside a Catalyst application, by calling the C<forward> method:
fc7ec1d9 537
5a8ed4fe 538 $c->forward('foo');
fc7ec1d9 539
129cfe74 540See L</Flow Control> for a full explanation of C<forward>. Note that, as
fc9c8698 541discussed there, when forwarding from another component, you must use
542the absolute path to the method, so that a private C<bar> method in your
543C<MyApp::Controller::Catalog::Order::Process> controller must, if called
544from elsewhere, be reached with
545C<$c-E<gt>forward('/catalog/order/process/bar')>.
fc7ec1d9 546
baf5120b 547=item * B<Args>
548
549Args is not an action type per se, but an action modifier - it adds a match
550restriction to any action it's provided to, requiring only as many path parts
551as are specified for the action to be valid - for example in
552MyApp::Controller::Foo,
553
554 sub bar :Local
555
556would match any URL starting /foo/bar/. To restrict this you can do
557
558 sub bar :Local :Args(1)
559
560to only match /foo/bar/*/
561
fc7ec1d9 562=back
563
b33ed88c 564B<Note:> After seeing these examples, you probably wonder what the point
56d8daeb 565is of defining names for regex and path actions. Every public action is
566also a private one, so you have one unified way of addressing components
567in your C<forward>s.
cda8d1ac 568
72d9bfc7 569=head4 Built-in Private Actions
fc7ec1d9 570
fc9c8698 571In response to specific application states, Catalyst will automatically
572call these built-in private actions in your application class:
fc7ec1d9 573
574=over 4
575
cda8d1ac 576=item * B<default : Private>
fc7ec1d9 577
fc9c8698 578Called when no other action matches. Could be used, for example, for
579displaying a generic frontpage for the main app, or an error page for
580individual controllers.
fc7ec1d9 581
0cf56dbc 582If C<default> isn't acting how you would expect, look at using a
cccc887d 583L</Literal> C<Path> action (with an empty path string). The difference is
e178a66a 584that C<Path> takes arguments relative from the namespace and C<default>
585I<always> takes arguments relative from the root, regardless of what
586controller it's in.
0cf56dbc 587
66f6e959 588=item * B<index : Private>
589
590C<index> is much like C<default> except that it takes no arguments
e178a66a 591and it is weighted slightly higher in the matching process. It is
592useful as a static entry point to a controller, e.g. to have a static
61a9002d 593welcome page. Note that it's also weighted higher than Path.
66f6e959 594
cda8d1ac 595=item * B<begin : Private>
fc7ec1d9 596
fc9c8698 597Called at the beginning of a request, before any matching actions are
598called.
fc7ec1d9 599
cda8d1ac 600=item * B<end : Private>
4a6895ce 601
fc7ec1d9 602Called at the end of a request, after all matching actions are called.
603
fc9c8698 604=back
605
6b10c72b 606=head4 Built-in actions in controllers/autochaining
fc7ec1d9 607
e178a66a 608 Package MyApp::Controller::Foo;
cda8d1ac 609 sub begin : Private { }
5a8ed4fe 610 sub default : Private { }
eff5f524 611 sub auto : Private { }
fc7ec1d9 612
fc9c8698 613You can define built-in private actions within your controllers as
614well. The actions will override the ones in less-specific controllers,
615or your application class. In other words, for each of the three
616built-in private actions, only one will be run in any request
e178a66a 617cycle. Thus, if C<MyApp::Controller::Catalog::begin> exists, it will be
618run in place of C<MyApp::begin> if you're in the C<catalog> namespace,
619and C<MyApp::Controller::Catalog::Order::begin> would override this in
620turn.
fc9c8698 621
eff5f524 622In addition to the normal built-in actions, you have a special action
623for making chains, C<auto>. Such C<auto> actions will be run after any
fc9c8698 624C<begin>, but before your action is processed. Unlike the other
eff5f524 625built-ins, C<auto> actions I<do not> override each other; they will be
626called in turn, starting with the application class and going through to
627the I<most> specific class. I<This is the reverse of the order in which
628the normal built-ins override each other>.
fc9c8698 629
630Here are some examples of the order in which the various built-ins
631would be called:
cda8d1ac 632
633=over 4
634
fc9c8698 635=item for a request for C</foo/foo>
cda8d1ac 636
637 MyApp::begin
80ef2e6d 638 MyApp::auto
e178a66a 639 MyApp::Controller::Foo::default # in the absence of MyApp::Controller::Foo::Foo
cda8d1ac 640 MyApp::end
641
fc9c8698 642=item for a request for C</foo/bar/foo>
cda8d1ac 643
e178a66a 644 MyApp::Controller::Foo::Bar::begin
80ef2e6d 645 MyApp::auto
e178a66a 646 MyApp::Controller::Foo::auto
647 MyApp::Controller::Foo::Bar::auto
648 MyApp::Controller::Foo::Bar::default # for MyApp::Controller::Foo::Bar::foo
649 MyApp::Controller::Foo::Bar::end
80ef2e6d 650
651=back
652
fc9c8698 653The C<auto> action is also distinguished by the fact that you can break
654out of the processing chain by returning 0. If an C<auto> action returns
6550, any remaining actions will be skipped, except for C<end>. So, for the
656request above, if the first auto returns false, the chain would look
657like this:
80ef2e6d 658
659=over 4
660
fc9c8698 661=item for a request for C</foo/bar/foo> where first C<auto> returns
662false
80ef2e6d 663
e178a66a 664 MyApp::Controller::Foo::Bar::begin
80ef2e6d 665 MyApp::auto
e178a66a 666 MyApp::Controller::Foo::Bar::end
cda8d1ac 667
668=back
4a6895ce 669
fc9c8698 670An example of why one might use this is an authentication action: you
671could set up a C<auto> action to handle authentication in your
672application class (which will always be called first), and if
673authentication fails, returning 0 would skip any remaining methods
674for that URL.
03805733 675
fc9c8698 676B<Note:> Looking at it another way, C<auto> actions have to return a
677true value to continue processing! You can also C<die> in the autochain
678action; in that case, the request will go straight to the finalize
679stage, without processing further actions.
03805733 680
6b10c72b 681=head4 URL Path Handling
4a6895ce 682
70d5ae49 683You can pass variable arguments as part of the URL path, separated with
684forward slashes (/). If the action is a Regex or LocalRegex, the '$' anchor
685must be used. For example, suppose you want to handle C</foo/$bar/$baz>,
686where C<$bar> and C<$baz> may vary:
4a6895ce 687
cda8d1ac 688 sub foo : Regex('^foo$') { my ($self, $context, $bar, $baz) = @_; }
4a6895ce 689
fc9c8698 690But what if you also defined actions for C</foo/boo> and C</foo/boo/hoo>?
4a6895ce 691
f29c48dd 692 sub boo : Path('foo/boo') { .. }
693 sub hoo : Path('foo/boo/hoo') { .. }
4a6895ce 694
695Catalyst matches actions in most specific to least specific order:
696
697 /foo/boo/hoo
698 /foo/boo
fc9c8698 699 /foo # might be /foo/bar/baz but won't be /foo/boo/hoo
4a6895ce 700
fc9c8698 701So Catalyst would never mistakenly dispatch the first two URLs to the
702'^foo$' action.
fc7ec1d9 703
70d5ae49 704If a Regex or LocalRegex action doesn't use the '$' anchor, the action will
705still match a URL containing arguments, however the arguments won't be
706available via C<@_>.
707
6b10c72b 708=head4 Parameter Processing
2ef2fb0f 709
fc9c8698 710Parameters passed in the URL query string are handled with methods in
711the L<Catalyst::Request> class. The C<param> method is functionally
712equivalent to the C<param> method of C<CGI.pm> and can be used in
713modules that require this.
2ef2fb0f 714
715 # http://localhost:3000/catalog/view/?category=hardware&page=3
716 my $category = $c->req->param('category');
717 my $current_page = $c->req->param('page') || 1;
718
719 # multiple values for single parameter name
720 my @values = $c->req->param('scrolling_list');
721
722 # DFV requires a CGI.pm-like input hash
723 my $results = Data::FormValidator->check($c->req->params, \%dfv_profile);
724
fc7ec1d9 725=head3 Flow Control
726
d08ced28 727You control the application flow with the C<forward> method, which
728accepts the key of an action to execute. This can be an action in the
729same or another Catalyst controller, or a Class name, optionally
730followed by a method name. After a C<forward>, the control flow will
731return to the method from which the C<forward> was issued.
732
733A C<forward> is similar to a method call. The main differences are that
734it wraps the call in an C<eval> to allow exception handling; it
735automatically passes along the context object (C<$c> or C<$context>);
736and it allows profiling of each call (displayed in the log with
737debugging enabled).
fc7ec1d9 738
e3dc9d78 739 sub hello : Global {
5a8ed4fe 740 my ( $self, $c ) = @_;
741 $c->stash->{message} = 'Hello World!';
d08ced28 742 $c->forward('check_message'); # $c is automatically included
5a8ed4fe 743 }
fc7ec1d9 744
4c6807d2 745 sub check_message : Private {
5a8ed4fe 746 my ( $self, $c ) = @_;
747 return unless $c->stash->{message};
4c6807d2 748 $c->forward('show_message');
5a8ed4fe 749 }
fc7ec1d9 750
4c6807d2 751 sub show_message : Private {
5a8ed4fe 752 my ( $self, $c ) = @_;
66f6e959 753 $c->res->body( $c->stash->{message} );
5a8ed4fe 754 }
3323f920 755
6c5c02ba 756A C<forward> does not create a new request, so your request object
757(C<$c-E<gt>req>) will remain unchanged. This is a key difference between
758using C<forward> and issuing a redirect.
3323f920 759
d08ced28 760You can pass new arguments to a C<forward> by adding them
761in an anonymous array. In this case C<$c-E<gt>req-E<gt>args>
762will be changed for the duration of the C<forward> only; upon
763return, the original value of C<$c-E<gt>req-E<gt>args> will
764be reset.
3323f920 765
766 sub hello : Global {
767 my ( $self, $c ) = @_;
768 $c->stash->{message} = 'Hello World!';
d08ced28 769 $c->forward('check_message',[qw/test1/]);
770 # now $c->req->args is back to what it was before
3323f920 771 }
772
d08ced28 773 sub check_message : Private {
774 my ( $self, $c ) = @_;
fabf3a10 775 my $first_argument = $c->req->args->[0]; # now = 'test1'
d08ced28 776 # do something...
777 }
b248fa4a 778
d08ced28 779As you can see from these examples, you can just use the method name as
780long as you are referring to methods in the same controller. If you want
781to forward to a method in another controller, or the main application,
782you will have to refer to the method by absolute path.
cda8d1ac 783
784 $c->forward('/my/controller/action');
d08ced28 785 $c->forward('/default'); # calls default in main application
fc7ec1d9 786
d08ced28 787Here are some examples of how to forward to classes and methods.
fc7ec1d9 788
e3dc9d78 789 sub hello : Global {
5a8ed4fe 790 my ( $self, $c ) = @_;
e178a66a 791 $c->forward(qw/MyApp::Model::Hello say_hello/);
5a8ed4fe 792 }
fc7ec1d9 793
e3dc9d78 794 sub bye : Global {
5a8ed4fe 795 my ( $self, $c ) = @_;
e178a66a 796 $c->forward('MyApp::Model::Hello'); # no method: will try 'process'
5a8ed4fe 797 }
fc7ec1d9 798
e178a66a 799 package MyApp::Model::Hello;
fc7ec1d9 800
801 sub say_hello {
802 my ( $self, $c ) = @_;
66f6e959 803 $c->res->body('Hello World!');
fc7ec1d9 804 }
805
806 sub process {
807 my ( $self, $c ) = @_;
66f6e959 808 $c->res->body('Goodbye World!');
fc7ec1d9 809 }
810
d08ced28 811Note that C<forward> returns to the calling action and continues
13436c14 812processing after the action finishes. If you want all further processing
813in the calling action to stop, use C<detach> instead, which will execute
814the C<detach>ed action and not return to the calling sub. In both cases,
815Catalyst will automatically try to call process() if you omit the
816method.
fc7ec1d9 817
818=head3 Components
819
56d8daeb 820Catalyst has an uncommonly flexible component system. You can define as
cccc887d 821many L</Models>, L</Views>, and L</Controllers> as you like.
fc7ec1d9 822
56d8daeb 823All components must inherit from L<Catalyst::Base>, which provides a
824simple class structure and some common class methods like C<config> and
825C<new> (constructor).
fc7ec1d9 826
e178a66a 827 package MyApp::Controller::Catalog;
fc7ec1d9 828
829 use strict;
830 use base 'Catalyst::Base';
831
832 __PACKAGE__->config( foo => 'bar' );
833
834 1;
835
6b10c72b 836You don't have to C<use> or otherwise register Models, Views, and
837Controllers. Catalyst automatically discovers and instantiates them
838when you call C<setup> in the main application. All you need to do is
839put them in directories named for each Component type. Notice that you
6c5c02ba 840can use a terse alias for each one.
fc7ec1d9 841
842=over 4
843
4a6895ce 844=item * B<MyApp/Model/>
fc7ec1d9 845
4a6895ce 846=item * B<MyApp/M/>
fc7ec1d9 847
4a6895ce 848=item * B<MyApp/View/>
fc7ec1d9 849
4a6895ce 850=item * B<MyApp/V/>
fc7ec1d9 851
4a6895ce 852=item * B<MyApp/Controller/>
fc7ec1d9 853
4a6895ce 854=item * B<MyApp/C/>
fc7ec1d9 855
856=back
857
6c5c02ba 858In older versions of Catalyst, the recommended practice (and the one
859automatically created by helper scripts) was to name the directories
860C<M/>, C<V/>, and C<C/>. Though these still work, we now recommend
861the use of the full names.
862
fc7ec1d9 863=head4 Views
864
129cfe74 865To show how to define views, we'll use an already-existing base class for the
866L<Template Toolkit|Template>, L<Catalyst::View::TT>. All we need to do is
867inherit from this class:
fc7ec1d9 868
e178a66a 869 package MyApp::View::TT;
fc7ec1d9 870
871 use strict;
872 use base 'Catalyst::View::TT';
873
874 1;
875
b33ed88c 876(You can also generate this automatically by using the helper script:
877
878 script/myapp_create.pl view TT TT
879
fb9257c1 880where the first C<TT> tells the script that the name of the view should
881be C<TT>, and the second that it should be a Template Toolkit view.)
b33ed88c 882
129cfe74 883This gives us a process() method and we can now just do
e178a66a 884$c->forward('MyApp::View::TT') to render our templates. The base class
885makes process() implicit, so we don't have to say
886C<$c-E<gt>forward(qw/MyApp::View::TT process/)>.
fc7ec1d9 887
e3dc9d78 888 sub hello : Global {
5a8ed4fe 889 my ( $self, $c ) = @_;
890 $c->stash->{template} = 'hello.tt';
891 }
fc7ec1d9 892
5a8ed4fe 893 sub end : Private {
894 my ( $self, $c ) = @_;
e178a66a 895 $c->forward('MyApp::View::TT');
5a8ed4fe 896 }
fc7ec1d9 897
6b10c72b 898You normally render templates at the end of a request, so it's a perfect
899use for the global C<end> action.
fc7ec1d9 900
129cfe74 901Also, be sure to put the template under the directory specified in
6b10c72b 902C<$c-E<gt>config-E<gt>{root}>, or you'll be forced to look at our
903eyecandy debug screen. ;)
fc7ec1d9 904
905=head4 Models
906
e178a66a 907To show how to define models, again we'll use an already-existing base
e112461a 908class, this time for L<DBIx::Class>: L<Catalyst::Model::DBIC::Schema>.
909We'll also need L<DBIx::Class::Schema::Loader>.
fc7ec1d9 910
911But first, we need a database.
912
913 -- myapp.sql
914 CREATE TABLE foo (
915 id INTEGER PRIMARY KEY,
916 data TEXT
917 );
918
919 CREATE TABLE bar (
920 id INTEGER PRIMARY KEY,
921 foo INTEGER REFERENCES foo,
922 data TEXT
923 );
924
925 INSERT INTO foo (data) VALUES ('TEST!');
926
927
928 % sqlite /tmp/myapp.db < myapp.sql
929
e112461a 930Now we can create a DBIC::SchemaLoader component for this database.
fc7ec1d9 931
e112461a 932 script/myapp_create.pl model DBIC DBIC::SchemaLoader 'dbi:SQLite:/tmp/myapp.db'
fc7ec1d9 933
e112461a 934L<DBIx::Class::Schema::Loader> automatically loads table layouts and
935relationships. Use the stash to pass data to your templates.
fc7ec1d9 936
e112461a 937We add the following to MyApp/Controller/Root.pm
b248fa4a 938
e112461a 939 sub view : Global {
940 my ( $self, $c, $id ) = @_;
941
942 $c->stash->{item} = $c->model('DBIC::Foo')->find($id);
943 }
fc7ec1d9 944
e112461a 945 1;
946
5a8ed4fe 947 sub end : Private {
948 my ( $self, $c ) = @_;
e112461a 949
5a8ed4fe 950 $c->stash->{template} ||= 'index.tt';
e112461a 951 $c->forward( $c->view('TT') );
5a8ed4fe 952 }
fc7ec1d9 953
e112461a 954We then create a new template file "root/index.tt" containing:
fc7ec1d9 955
e112461a 956 The Id's data is [% item.data %]
fc7ec1d9 957
6b10c72b 958Models do not have to be part of your Catalyst application; you
959can always call an outside module that serves as your Model:
960
961 # in a Controller
962 sub list : Local {
963 my ( $self, $c ) = @_;
e112461a 964
6b10c72b 965 $c->stash->{template} = 'list.tt';
e112461a 966
967 use Some::Outside::DBIC::Module;
968 my @records = Some::Outside::DBIC::Module->search({
969 artist => 'sri',
970 });
971
6b10c72b 972 $c->stash->{records} = \@records;
973 }
974
975But by using a Model that is part of your Catalyst application, you gain
976several things: you don't have to C<use> each component, Catalyst will
977find and load it automatically at compile-time; you can C<forward> to
26e73131 978the module, which can only be done to Catalyst components; and only
6b10c72b 979Catalyst components can be fetched with
e178a66a 980C<$c-E<gt>model('SomeModel')>.
6b10c72b 981
982Happily, since many people have existing Model classes that they
983would like to use with Catalyst (or, conversely, they want to
984write Catalyst models that can be used outside of Catalyst, e.g.
985in a cron job), it's trivial to write a simple component in
986Catalyst that slurps in an outside Model:
987
e112461a 988 package MyApp::Model::DB;
989 use base qw/Catalyst::Model::DBIC::Schema/;
990 __PACKAGE__->config(
991 schema_class => 'Some::DBIC::Schema',
cccc887d 992 connect_info => ['dbi:SQLite:foo.db', '', '', {AutoCommit=>1}]
e112461a 993 );
6b10c72b 994 1;
995
e112461a 996and that's it! Now C<Some::DBIC::Schema> is part of your
997Cat app as C<MyApp::Model::DB>.
6b10c72b 998
fc7ec1d9 999=head4 Controllers
1000
129cfe74 1001Multiple controllers are a good way to separate logical domains of your
1002application.
fc7ec1d9 1003
e178a66a 1004 package MyApp::Controller::Login;
fc7ec1d9 1005
c02f7490 1006 use base qw/Catalyst::Controller/;
1007
1008 sub sign_in : Path("sign-in") { }
1009 sub new_password : Path("new-password") { }
1010 sub sign_out : Path("sign-out") { }
fc7ec1d9 1011
e178a66a 1012 package MyApp::Controller::Catalog;
fc7ec1d9 1013
c02f7490 1014 use base qw/Catalyst::Controller/;
1015
e3dc9d78 1016 sub view : Local { }
1017 sub list : Local { }
fc7ec1d9 1018
e178a66a 1019 package MyApp::Controller::Cart;
fc7ec1d9 1020
c02f7490 1021 use base qw/Catalyst::Controller/;
1022
e3dc9d78 1023 sub add : Local { }
1024 sub update : Local { }
1025 sub order : Local { }
fc7ec1d9 1026
c02f7490 1027Note that you can also supply attributes via the Controller's config so long
1028as you have at least one attribute on a subref to be exported (:Action is
1029commonly used for this) - for example the following is equivalent to the same
1030controller above
1031
1032 package MyApp::Controller::Login;
1033
1034 use base qw/Catalyst::Controller/;
1035
1036 __PACKAGE__->config(
1037 actions => {
1038 'sign_in' => { Path => 'sign-in' },
1039 'new_password' => { Path => 'new-password' },
1040 'sign_out' => { Path => 'sign-out' },
1041 },
1042 );
1043
1044 sub sign_in : Action { }
1045 sub new_password : Action { }
1046 sub sign_out : Action { }
1047
24cda51b 1048=head3 Models
1049
1050Models are providers of data. This data could come from anywhere - a search
1051engine index, a database table, etc. Typically the data source does not have
1052much to do with web applications or Catalyst - it could be used to write an
1053offline report generator or a command line tool just the same.
1054
1055The common approach to writing a Catalyst-style model for your application is
1056wrapping a generic model (e.g. L<DBIx::Class::Schema>, a bunch of XMLs, or
1057anything really) with an object that contains configuration data, convenience
1058methods, and so forth.
1059
1060#### editor: move this part to =head3 Components somehow, right after this
1061#### section - this will require deeply rephrasing this paragraph.
1062
1063Technically, within Catalyst a model is a B<component> - an instance of the
1064model's class belonging to the application. It is important to stress that the
1065lifetime of these objects is per application, not per request.
1066
1067While the model base class (L<Catalyst::Model>) provides things like C<config>
1068and stuff to better integrate the model into the application, sometimes this is
1069not enough, and the model requires access to C<$c> itself.
1070
1071Situations where this need might arise include:
1072
1073=over 4
1074
1075=item *
1076
1077Interacting with another model
1078
1079=item *
1080
1081Using per-request data to control behavior
1082
1083=item *
1084
1085Using plugins in (for example L<Catalyst::Plugin::Cache>).
1086
1087=back
1088
6c5c02ba 1089From a style perspective usually it's bad to make your model "too smart"
1090about things - it should worry about business logic and leave the
1091integration details to the controllers. If, however, you find that it
1092does not make sense at all to use an auxillary controller around the
1093model, and the model's need to access C<$c> cannot be sidestepped, there
1094exists a power tool called C<ACCEPT_CONTEXT>.
24cda51b 1095
1096#### editor note: this part is "generic" - it also applies to views and
1097#### controllers.
1098
1099=head3 ACCEPT_CONTEXT
1100
6c5c02ba 1101Whenever you call $c->component("Foo") you get back an object - the
1102instance of the model. If the component supports the C<ACCEPT_CONTEXT>
1103method instead of returning the model itself, the return value of C<<
1104$model->ACCEPT_CONTEXT( $c ) >> will be used.
24cda51b 1105
1106This means that whenever your model/view/controller needs to talk to C<$c> it
1107gets a chance to do this when it's needed.
1108
1109A typical C<ACCEPT_CONTEXT> method will either clone the model and return one
1110with the context object set, or it will return a thin wrapper that contains
1111C<$c> and delegates to the per-application model object.
1112
6c5c02ba 1113A typical C<ACCEPT_CONTEXT> method could look like this:
24cda51b 1114
1115 sub ACCEPT_CONTEXT {
1116 my ( $self, $c, @extra_arguments ) = @_;
1117 bless { %$self, c => $c }, ref($self);
1118 }
1119
1120effectively treating $self as a B<prototype object> that gets a new parameter.
1121C<@extra_arguments> comes from any trailing arguments to
1122C<< $c->component( $bah, @extra_arguments ) >> (or C<< $c->model(...) >>,
1123C<< $c->view(...) >> etc).
1124
1125The life time of this value is B<per usage>, and not per request. To make this
1126per request you can use the following technique:
1127
1128Add a field to C<$c>, like C<my_model_instance>. Then write your
1129C<ACCEPT_CONTEXT> method to look like this:
1130
1131 sub ACCEPT_CONTEXT {
1132 my ( $self, $c ) = @_;
1133
1134 if ( my $per_request = $c->my_model_instance ) {
1135 return $per_request;
1136 } else {
1137 my $new_instance = bless { %$self, c => $c }, ref($self);
1138 Scalar::Util::weaken($new_instance->{c}); # or we have a circular reference
1139 $c->my_model_instance( $new_instance );
1140 return $new_instance;
1141 }
1142 }
1143
1144
fc7ec1d9 1145=head3 Testing
1146
6c5c02ba 1147Catalyst has a built-in http server for testing. (Later, you can easily
1148use a more powerful server, e.g. Apache/mod_perl or FastCGI, in a
1149production environment.)
fc7ec1d9 1150
1151Start your application on the command line...
1152
b33ed88c 1153 script/myapp_server.pl
fc7ec1d9 1154
1155...then visit http://localhost:3000/ in a browser to view the output.
1156
1157You can also do it all from the command line:
1158
b33ed88c 1159 script/myapp_test.pl http://localhost/
fc7ec1d9 1160
1161Have fun!
1162
3cb1db8c 1163=head1 SUPPORT
1164
1165IRC:
1166
1167 Join #catalyst on irc.perl.org.
1168
72d9bfc7 1169Mailing-lists:
3cb1db8c 1170
1171 http://lists.rawmode.org/mailman/listinfo/catalyst
1172 http://lists.rawmode.org/mailman/listinfo/catalyst-dev
1173
fc7ec1d9 1174=head1 AUTHOR
1175
cda8d1ac 1176Sebastian Riedel, C<sri@oook.de>
1177David Naughton, C<naughton@umn.edu>
1178Marcus Ramberg, C<mramberg@cpan.org>
f531dd37 1179Jesse Sheidlower, C<jester@panix.com>
129cfe74 1180Danijel Milicevic, C<me@danijel.de>
c37916b0 1181Kieren Diment, C<kd@totaldatasolution.com>
24cda51b 1182Yuval Kogman, C<nothingmuch@woobling.org>
fc7ec1d9 1183
1184=head1 COPYRIGHT
1185
aa2b0d97 1186This program is free software, you can redistribute it and/or modify it
1187under the same terms as Perl itself.