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