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