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