Clarification of purpose of QuickStart application
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Manual / Intro.pod
CommitLineData
fc7ec1d9 1=head1 NAME
2
3Catalyst::Manual::Intro - Introduction to Catalyst
4
5=head1 DESCRIPTION
6
670b3d78 7This is a brief introduction to Catalyst. It explains the most important
aa2b0d97 8features of how Catalyst works and shows how to get a simple application
9up and running quickly. For an introduction (without code) to Catalyst
10itself, and why you should be using it, see L<Catalyst::Manual::About>.
fc7ec1d9 11
12=head2 What is Catalyst?
13
129cfe74 14Catalyst is an elegant web application framework, extremely flexible yet
56d8daeb 15extremely simple. It's similar to Ruby on Rails, Spring (Java), and
e178a66a 16L<Maypole>, upon which it was originally based.
fc7ec1d9 17
18=head3 MVC
19
e178a66a 20Catalyst follows the Model-View-Controller (MVC) design pattern,
21allowing you to easily separate concerns, like content, presentation,
22and flow control, into separate modules. This separation allows you to
23modify code that handles one concern without affecting code that handles
24the others. Catalyst promotes the re-use of existing Perl modules that
25already handle common web application concerns well.
fc7ec1d9 26
e178a66a 27Here's how the M, V, and C map to those concerns, with examples of
28well-known Perl modules you may want to use for each.
fc7ec1d9 29
30=over 4
31
4a6895ce 32=item * B<Model>
fc7ec1d9 33
e112461a 34Access and modify content (data). L<DBIx::Class>, L<Class::DBI>,
95bb1e81 35L<Plucene>, L<Net::LDAP>...
fc7ec1d9 36
4a6895ce 37=item * B<View>
fc7ec1d9 38
e178a66a 39Present content to the user. L<Template Toolkit|Template>,
40L<Mason|HTML::Mason>, L<HTML::Template>...
fc7ec1d9 41
4a6895ce 42=item * B<Controller>
fc7ec1d9 43
129cfe74 44Control the whole request phase, check parameters, dispatch actions, flow
56d8daeb 45control. Catalyst itself!
fc7ec1d9 46
47=back
48
26e73131 49If you're unfamiliar with MVC and design patterns, you may want to check
50out the original book on the subject, I<Design Patterns>, by Gamma,
56d8daeb 51Helm, Johnson, and Vlissides, also known as the Gang of Four (GoF).
52Many, many web application frameworks are based on MVC, including all
53those listed above.
fc7ec1d9 54
55=head3 Flexibility
56
e178a66a 57Catalyst is much more flexible than many other frameworks. We'll talk
58more about this later, but rest assured you can use your favorite Perl
59modules with Catalyst.
fc7ec1d9 60
61=over 4
62
72d9bfc7 63=item * B<Multiple Models, Views, and Controllers>
fc7ec1d9 64
e178a66a 65To build a Catalyst application, you handle each type of concern inside
66special modules called L</Components>. Often this code will be very
67simple, just calling out to Perl modules like those listed above under
68L</MVC>. Catalyst handles these components in a very flexible way. Use
69as many Models, Views, and Controllers as you like, using as many
70different Perl modules as you like, all in the same application. Want to
71manipulate multiple databases, and retrieve some data via LDAP? No
72problem. Want to present data from the same Model using L<Template
73Toolkit|Template> and L<PDF::Template>? Easy.
fc7ec1d9 74
cda8d1ac 75=item * B<Reuseable Components>
fc7ec1d9 76
e178a66a 77Not only does Catalyst promote the re-use of already existing Perl
78modules, it also allows you to re-use your Catalyst components in
79multiple Catalyst applications.
fc7ec1d9 80
4a6895ce 81=item * B<Unrestrained URL-to-Action Dispatching>
fc7ec1d9 82
cccc887d 83Catalyst allows you to dispatch any URLs to any application L</Actions>,
e178a66a 84even through regular expressions! Unlike most other frameworks, it
85doesn't require mod_rewrite or class and method names in URLs.
fc7ec1d9 86
e178a66a 87With Catalyst you register your actions and address them directly. For
88example:
fc7ec1d9 89
e3dc9d78 90 sub hello : Global {
fc7ec1d9 91 my ( $self, $context ) = @_;
66f6e959 92 $context->response->body('Hello World!');
5a8ed4fe 93 }
fc7ec1d9 94
95Now http://localhost:3000/hello prints "Hello World!".
96
4a6895ce 97=item * B<Support for CGI, mod_perl, Apache::Request>
fc7ec1d9 98
99Use L<Catalyst::Engine::Apache> or L<Catalyst::Engine::CGI>.
100
101=back
102
103=head3 Simplicity
104
e178a66a 105The best part is that Catalyst implements all this flexibility in a very
106simple way.
fc7ec1d9 107
6f4e1683 108=over 4
109
4a6895ce 110=item * B<Building Block Interface>
fc7ec1d9 111
e178a66a 112Components interoperate very smoothly. For example, Catalyst
cccc887d 113automatically makes a L</Context> object available to every
e178a66a 114component. Via the context, you can access the request object, share
115data between components, and control the flow of your
116application. Building a Catalyst application feels a lot like snapping
129cfe74 117together toy building blocks, and everything just works.
fc7ec1d9 118
4a6895ce 119=item * B<Component Auto-Discovery>
fc7ec1d9 120
e178a66a 121No need to C<use> all of your components. Catalyst automatically finds
122and loads them.
fc7ec1d9 123
4a6895ce 124=item * B<Pre-Built Components for Popular Modules>
fc7ec1d9 125
e112461a 126See L<Catalyst::Model::DBIC::Schema> for L<DBIx::Class>, or
127L<Catalyst::View::TT> for L<Template Toolkit|Template>.
fc7ec1d9 128
72d9bfc7 129=item * B<Built-in Test Framework>
fc7ec1d9 130
e178a66a 131Catalyst comes with a built-in, lightweight http server and test
132framework, making it easy to test applications from the command line.
fc7ec1d9 133
4a6895ce 134=item * B<Helper Scripts>
fc7ec1d9 135
e178a66a 136Catalyst provides helper scripts to quickly generate running starter
137code for components and unit tests. See L<Catalyst::Helper>.
fc7ec1d9 138
6f4e1683 139=back
140
fc7ec1d9 141=head2 Quickstart
142
e178a66a 143Here's how to install Catalyst and get a simple application up and
144running, using the helper scripts described above.
fc7ec1d9 145
146=head3 Install
147
d538823f 148 $ perl -MCPAN -e 'install Task::Catalyst'
fc7ec1d9 149
150=head3 Setup
151
2feb6632 152 $ catalyst.pl MyApp
b33ed88c 153 # output omitted
2feb6632 154 $ cd MyApp
ac4a0ae0 155 $ script/myapp_create.pl controller Library::Login
fc7ec1d9 156
157=head3 Run
158
b33ed88c 159 $ script/myapp_server.pl
fc7ec1d9 160
129cfe74 161Now visit these locations with your favorite browser or user agent to see
162Catalyst in action:
fc7ec1d9 163
51aec62b 164(NOTE: Although we create a controller here, we don't actually use it.
165Both of these URLs should take you to the welcome page.)
166
167
fc7ec1d9 168=over 4
169
170=item http://localhost:3000/
171
ac4a0ae0 172=item http://localhost:3000/library/login/
fc7ec1d9 173
174=back
175
56d8daeb 176Easy!
fc7ec1d9 177
178=head2 How It Works
179
e178a66a 180Let's see how Catalyst works, by taking a closer look at the components
181and other parts of a Catalyst application.
fc7ec1d9 182
183=head3 Application Class
184
e178a66a 185In addition to the Model, View, and Controller components, there's a
186single class that represents your application itself. This is where you
187configure your application, load plugins, define application-wide
188actions, and extend Catalyst.
fc7ec1d9 189
190 package MyApp;
191
192 use strict;
193 use Catalyst qw/-Debug/;
194
195 MyApp->config(
196 name => 'My Application',
fc7ec1d9 197
b33ed88c 198 # You can put anything else you want in here:
199 my_configuration_variable => 'something',
fc7ec1d9 200 );
201
5a8ed4fe 202 sub default : Private {
fc7ec1d9 203 my ( $self, $context ) = @_;
e178a66a 204 $context->response->body('Catalyst rocks!');
5a8ed4fe 205 }
fc7ec1d9 206
207 1;
208
66f6e959 209For most applications, Catalyst requires you to define only one config
210parameter:
fc7ec1d9 211
212=over 4
213
4a6895ce 214=item * B<name>
fc7ec1d9 215
56d8daeb 216The name of your application.
fc7ec1d9 217
fc7ec1d9 218=back
219
e178a66a 220Optionally, you can specify a B<root> parameter for templates and static
221data. If omitted, Catalyst will try to auto-detect the directory's
222location. You can define as many parameters as you want for plugins or
223whatever you need. You can access them anywhere in your application via
224C<$context-E<gt>config-E<gt>{$param_name}>.
fc7ec1d9 225
226=head3 Context
227
e178a66a 228Catalyst automatically blesses a Context object into your application
229class and makes it available everywhere in your application. Use the
cccc887d 230Context to directly interact with Catalyst and glue your L</Components>
e178a66a 231together. For example, if you need to use the Context from within a
232Template Toolkit template, it's already there:
c42f5bbf 233
234 <h1>Welcome to [% c.config.name %]!</h1>
fc7ec1d9 235
e178a66a 236As illustrated in our URL-to-Action dispatching example, the Context is
237always the second method parameter, behind the Component object
238reference or class name itself. Previously we called it C<$context> for
239clarity, but most Catalyst developers just call it C<$c>:
fc7ec1d9 240
e3dc9d78 241 sub hello : Global {
fc7ec1d9 242 my ( $self, $c ) = @_;
66f6e959 243 $c->res->body('Hello World!');
5a8ed4fe 244 }
fc7ec1d9 245
246The Context contains several important objects:
247
248=over 4
249
250=item * L<Catalyst::Request>
251
252 $c->request
253 $c->req # alias
254
129cfe74 255The request object contains all kinds of request-specific information, like
256query parameters, cookies, uploads, headers, and more.
fc7ec1d9 257
258 $c->req->params->{foo};
259 $c->req->cookies->{sessionid};
260 $c->req->headers->content_type;
261 $c->req->base;
262
afdca3a3 263=item * L<Catalyst::Response>
fc7ec1d9 264
265 $c->response
266 $c->res # alias
267
129cfe74 268The response is like the request, but contains just response-specific
269information.
fc7ec1d9 270
66f6e959 271 $c->res->body('Hello World');
fc7ec1d9 272 $c->res->status(404);
273 $c->res->redirect('http://oook.de');
274
275=item * L<Catalyst::Config>
276
277 $c->config
fc7ec1d9 278 $c->config->root;
279 $c->config->name;
280
281=item * L<Catalyst::Log>
282
283 $c->log
fc7ec1d9 284 $c->log->debug('Something happened');
285 $c->log->info('Something you should know');
286
4a6895ce 287=item * B<Stash>
fc7ec1d9 288
289 $c->stash
fc7ec1d9 290 $c->stash->{foo} = 'bar';
291
292=back
293
129cfe74 294The last of these, the stash, is a universal hash for sharing data among
295application components. For an example, we return to our 'hello' action:
fc7ec1d9 296
e3dc9d78 297 sub hello : Global {
5a8ed4fe 298 my ( $self, $c ) = @_;
299 $c->stash->{message} = 'Hello World!';
4c6807d2 300 $c->forward('show_message');
5a8ed4fe 301 }
fc7ec1d9 302
4c6807d2 303 sub show_message : Private {
5a8ed4fe 304 my ( $self, $c ) = @_;
66f6e959 305 $c->res->body( $c->stash->{message} );
5a8ed4fe 306 }
fc7ec1d9 307
e178a66a 308Note that the stash should be used only for passing data in an
309individual request cycle; it gets cleared at a new request. If you need
310to maintain more persistent data, use a session.
dd25a192 311
fc7ec1d9 312=head3 Actions
313
56d8daeb 314A Catalyst controller is defined by its actions. An action is a
315subroutine with a special attribute. You've already seen some examples
316of actions in this document. The URL (for example
317http://localhost.3000/foo/bar) consists of two parts, the base
318(http://localhost:3000/ in this example) and the path (foo/bar). Please
319note that the trailing slash after the hostname[:port] always belongs to
320base and not to the action.
cda8d1ac 321
322Catalyst supports several types of actions:
fc7ec1d9 323
324=over 4
325
56d8daeb 326=item * B<Literal> (B<Path> actions)
fc7ec1d9 327
e178a66a 328 package MyApp::Controller::My::Controller;
f29c48dd 329 sub bar : Path('foo/bar') { }
fc7ec1d9 330
e178a66a 331Literal C<Path> actions will act relative to their current
332namespace. The above example matches only
333http://localhost:3000/my/controller/foo/bar. If you start your path with
334a forward slash, it will match from the root. Example:
0cf56dbc 335
e178a66a 336 package MyApp::Controller::My::Controller;
0cf56dbc 337 sub bar : Path('/foo/bar') { }
338
fc7ec1d9 339Matches only http://localhost:3000/foo/bar.
340
e178a66a 341 package MyApp::Controller::My::Controller;
0cf56dbc 342 sub bar : Path { }
343
e178a66a 344By leaving the C<Path> definition empty, it will match on the namespace
345root. The above code matches http://localhost:3000/my/controller.
0cf56dbc 346
4a6895ce 347=item * B<Regex>
fc7ec1d9 348
b33ed88c 349 sub bar : Regex('^item(\d+)/order(\d+)$') { }
fc7ec1d9 350
129cfe74 351Matches any URL that matches the pattern in the action key, e.g.
e178a66a 352http://localhost:3000/item23/order42. The '' around the regexp is
353optional, but perltidy likes it. :)
b33ed88c 354
e178a66a 355Regex matches act globally, i.e. without reference to the namespace from
356which it is called, so that a C<bar> method in the
357C<MyApp::Controller::Catalog::Order::Process> namespace won't match any
358form of C<bar>, C<Catalog>, C<Order>, or C<Process> unless you
359explicitly put this in the regex. To achieve the above, you should
360consider using a C<LocalRegex> action.
66f6e959 361
362=item * B<LocalRegex>
363
364 sub bar : LocalRegex('^widget(\d+)$') { }
fc7ec1d9 365
66f6e959 366LocalRegex actions act locally. If you were to use C<bar> in
0cf56dbc 367C<MyApp::Controller::Catalog>, the above example would match urls like
368http://localhost:3000/catalog/widget23.
369
e178a66a 370If you omit the "C<^>" from your regex, then it will match any depth
371from the controller and not immediately off of the controller name. The
372following example differs from the above code in that it will match
0cf56dbc 373http://localhost:3000/catalog/foo/widget23 as well.
374
375 package MyApp::Controller::Catalog;
376 sub bar : LocalRegex('widget(\d+)$') { }
66f6e959 377
e178a66a 378For both LocalRegex and Regex actions, if you use capturing parentheses
379to extract values within the matching URL, those values are available in
2982e768 380the C<$c-E<gt>req-E<gt>captures> array. In the above example, "widget23"
e178a66a 381would capture "23" in the above example, and
2982e768 382C<$c-E<gt>req-E<gt>captures-E<gt>[0]> would be "23". If you want to pass
e178a66a 383arguments at the end of your URL, you must use regex action keys. See
384L</URL Path Handling> below.
fc7ec1d9 385
56d8daeb 386=item * B<Top-level> (B<Global>)
cda8d1ac 387
388 package MyApp;
389 sub foo : Global { }
390
b33ed88c 391Matches http://localhost:3000/foo. The function name is mapped directly
392to the application base.
cda8d1ac 393
56d8daeb 394=item * B<Namespace-Prefixed> (B<Local>)
fc7ec1d9 395
e178a66a 396 package MyApp::Controller::My::Controller;
e3dc9d78 397 sub foo : Local { }
fc7ec1d9 398
cda8d1ac 399Matches http://localhost:3000/my/controller/foo.
fc7ec1d9 400
129cfe74 401This action type indicates that the matching URL must be prefixed with a
e178a66a 402modified form of the component's class (package) name. This modified
403class name excludes the parts that have a pre-defined meaning in
404Catalyst ("MyApp::Controller" in the above example), replaces "::" with
405"/", and converts the name to lower case. See L</Components> for a full
406explanation of the pre-defined meaning of Catalyst component class
407names.
fc7ec1d9 408
4a6895ce 409=item * B<Private>
fc7ec1d9 410
5a8ed4fe 411 sub foo : Private { }
fc7ec1d9 412
e178a66a 413Matches no URL, and cannot be executed by requesting a URL that
414corresponds to the action key. Private actions can be executed only
415inside a Catalyst application, by calling the C<forward> method:
fc7ec1d9 416
5a8ed4fe 417 $c->forward('foo');
fc7ec1d9 418
129cfe74 419See L</Flow Control> for a full explanation of C<forward>. Note that, as
fc9c8698 420discussed there, when forwarding from another component, you must use
421the absolute path to the method, so that a private C<bar> method in your
422C<MyApp::Controller::Catalog::Order::Process> controller must, if called
423from elsewhere, be reached with
424C<$c-E<gt>forward('/catalog/order/process/bar')>.
fc7ec1d9 425
426=back
427
b33ed88c 428B<Note:> After seeing these examples, you probably wonder what the point
56d8daeb 429is of defining names for regex and path actions. Every public action is
430also a private one, so you have one unified way of addressing components
431in your C<forward>s.
cda8d1ac 432
72d9bfc7 433=head4 Built-in Private Actions
fc7ec1d9 434
fc9c8698 435In response to specific application states, Catalyst will automatically
436call these built-in private actions in your application class:
fc7ec1d9 437
438=over 4
439
cda8d1ac 440=item * B<default : Private>
fc7ec1d9 441
fc9c8698 442Called when no other action matches. Could be used, for example, for
443displaying a generic frontpage for the main app, or an error page for
444individual controllers.
fc7ec1d9 445
0cf56dbc 446If C<default> isn't acting how you would expect, look at using a
cccc887d 447L</Literal> C<Path> action (with an empty path string). The difference is
e178a66a 448that C<Path> takes arguments relative from the namespace and C<default>
449I<always> takes arguments relative from the root, regardless of what
450controller it's in.
0cf56dbc 451
66f6e959 452=item * B<index : Private>
453
454C<index> is much like C<default> except that it takes no arguments
e178a66a 455and it is weighted slightly higher in the matching process. It is
456useful as a static entry point to a controller, e.g. to have a static
61a9002d 457welcome page. Note that it's also weighted higher than Path.
66f6e959 458
cda8d1ac 459=item * B<begin : Private>
fc7ec1d9 460
fc9c8698 461Called at the beginning of a request, before any matching actions are
462called.
fc7ec1d9 463
cda8d1ac 464=item * B<end : Private>
4a6895ce 465
fc7ec1d9 466Called at the end of a request, after all matching actions are called.
467
fc9c8698 468=back
469
6b10c72b 470=head4 Built-in actions in controllers/autochaining
fc7ec1d9 471
e178a66a 472 Package MyApp::Controller::Foo;
cda8d1ac 473 sub begin : Private { }
5a8ed4fe 474 sub default : Private { }
eff5f524 475 sub auto : Private { }
fc7ec1d9 476
fc9c8698 477You can define built-in private actions within your controllers as
478well. The actions will override the ones in less-specific controllers,
479or your application class. In other words, for each of the three
480built-in private actions, only one will be run in any request
e178a66a 481cycle. Thus, if C<MyApp::Controller::Catalog::begin> exists, it will be
482run in place of C<MyApp::begin> if you're in the C<catalog> namespace,
483and C<MyApp::Controller::Catalog::Order::begin> would override this in
484turn.
fc9c8698 485
eff5f524 486In addition to the normal built-in actions, you have a special action
487for making chains, C<auto>. Such C<auto> actions will be run after any
fc9c8698 488C<begin>, but before your action is processed. Unlike the other
eff5f524 489built-ins, C<auto> actions I<do not> override each other; they will be
490called in turn, starting with the application class and going through to
491the I<most> specific class. I<This is the reverse of the order in which
492the normal built-ins override each other>.
fc9c8698 493
494Here are some examples of the order in which the various built-ins
495would be called:
cda8d1ac 496
497=over 4
498
fc9c8698 499=item for a request for C</foo/foo>
cda8d1ac 500
501 MyApp::begin
80ef2e6d 502 MyApp::auto
e178a66a 503 MyApp::Controller::Foo::default # in the absence of MyApp::Controller::Foo::Foo
cda8d1ac 504 MyApp::end
505
fc9c8698 506=item for a request for C</foo/bar/foo>
cda8d1ac 507
e178a66a 508 MyApp::Controller::Foo::Bar::begin
80ef2e6d 509 MyApp::auto
e178a66a 510 MyApp::Controller::Foo::auto
511 MyApp::Controller::Foo::Bar::auto
512 MyApp::Controller::Foo::Bar::default # for MyApp::Controller::Foo::Bar::foo
513 MyApp::Controller::Foo::Bar::end
80ef2e6d 514
515=back
516
fc9c8698 517The C<auto> action is also distinguished by the fact that you can break
518out of the processing chain by returning 0. If an C<auto> action returns
5190, any remaining actions will be skipped, except for C<end>. So, for the
520request above, if the first auto returns false, the chain would look
521like this:
80ef2e6d 522
523=over 4
524
fc9c8698 525=item for a request for C</foo/bar/foo> where first C<auto> returns
526false
80ef2e6d 527
e178a66a 528 MyApp::Controller::Foo::Bar::begin
80ef2e6d 529 MyApp::auto
e178a66a 530 MyApp::Controller::Foo::Bar::end
cda8d1ac 531
532=back
4a6895ce 533
fc9c8698 534An example of why one might use this is an authentication action: you
535could set up a C<auto> action to handle authentication in your
536application class (which will always be called first), and if
537authentication fails, returning 0 would skip any remaining methods
538for that URL.
03805733 539
fc9c8698 540B<Note:> Looking at it another way, C<auto> actions have to return a
541true value to continue processing! You can also C<die> in the autochain
542action; in that case, the request will go straight to the finalize
543stage, without processing further actions.
03805733 544
6b10c72b 545=head4 URL Path Handling
4a6895ce 546
70d5ae49 547You can pass variable arguments as part of the URL path, separated with
548forward slashes (/). If the action is a Regex or LocalRegex, the '$' anchor
549must be used. For example, suppose you want to handle C</foo/$bar/$baz>,
550where C<$bar> and C<$baz> may vary:
4a6895ce 551
cda8d1ac 552 sub foo : Regex('^foo$') { my ($self, $context, $bar, $baz) = @_; }
4a6895ce 553
fc9c8698 554But what if you also defined actions for C</foo/boo> and C</foo/boo/hoo>?
4a6895ce 555
f29c48dd 556 sub boo : Path('foo/boo') { .. }
557 sub hoo : Path('foo/boo/hoo') { .. }
4a6895ce 558
559Catalyst matches actions in most specific to least specific order:
560
561 /foo/boo/hoo
562 /foo/boo
fc9c8698 563 /foo # might be /foo/bar/baz but won't be /foo/boo/hoo
4a6895ce 564
fc9c8698 565So Catalyst would never mistakenly dispatch the first two URLs to the
566'^foo$' action.
fc7ec1d9 567
70d5ae49 568If a Regex or LocalRegex action doesn't use the '$' anchor, the action will
569still match a URL containing arguments, however the arguments won't be
570available via C<@_>.
571
6b10c72b 572=head4 Parameter Processing
2ef2fb0f 573
fc9c8698 574Parameters passed in the URL query string are handled with methods in
575the L<Catalyst::Request> class. The C<param> method is functionally
576equivalent to the C<param> method of C<CGI.pm> and can be used in
577modules that require this.
2ef2fb0f 578
579 # http://localhost:3000/catalog/view/?category=hardware&page=3
580 my $category = $c->req->param('category');
581 my $current_page = $c->req->param('page') || 1;
582
583 # multiple values for single parameter name
584 my @values = $c->req->param('scrolling_list');
585
586 # DFV requires a CGI.pm-like input hash
587 my $results = Data::FormValidator->check($c->req->params, \%dfv_profile);
588
fc7ec1d9 589=head3 Flow Control
590
d08ced28 591You control the application flow with the C<forward> method, which
592accepts the key of an action to execute. This can be an action in the
593same or another Catalyst controller, or a Class name, optionally
594followed by a method name. After a C<forward>, the control flow will
595return to the method from which the C<forward> was issued.
596
597A C<forward> is similar to a method call. The main differences are that
598it wraps the call in an C<eval> to allow exception handling; it
599automatically passes along the context object (C<$c> or C<$context>);
600and it allows profiling of each call (displayed in the log with
601debugging enabled).
fc7ec1d9 602
e3dc9d78 603 sub hello : Global {
5a8ed4fe 604 my ( $self, $c ) = @_;
605 $c->stash->{message} = 'Hello World!';
d08ced28 606 $c->forward('check_message'); # $c is automatically included
5a8ed4fe 607 }
fc7ec1d9 608
4c6807d2 609 sub check_message : Private {
5a8ed4fe 610 my ( $self, $c ) = @_;
611 return unless $c->stash->{message};
4c6807d2 612 $c->forward('show_message');
5a8ed4fe 613 }
fc7ec1d9 614
4c6807d2 615 sub show_message : Private {
5a8ed4fe 616 my ( $self, $c ) = @_;
66f6e959 617 $c->res->body( $c->stash->{message} );
5a8ed4fe 618 }
3323f920 619
d08ced28 620A C<forward> does not create a new request, so your request
621object (C<$c-E<gt>req>) will remain unchanged. This is a
622key difference between using C<forward> and issuing a
623redirect.
3323f920 624
d08ced28 625You can pass new arguments to a C<forward> by adding them
626in an anonymous array. In this case C<$c-E<gt>req-E<gt>args>
627will be changed for the duration of the C<forward> only; upon
628return, the original value of C<$c-E<gt>req-E<gt>args> will
629be reset.
3323f920 630
631 sub hello : Global {
632 my ( $self, $c ) = @_;
633 $c->stash->{message} = 'Hello World!';
d08ced28 634 $c->forward('check_message',[qw/test1/]);
635 # now $c->req->args is back to what it was before
3323f920 636 }
637
d08ced28 638 sub check_message : Private {
639 my ( $self, $c ) = @_;
fabf3a10 640 my $first_argument = $c->req->args->[0]; # now = 'test1'
d08ced28 641 # do something...
642 }
b248fa4a 643
d08ced28 644As you can see from these examples, you can just use the method name as
645long as you are referring to methods in the same controller. If you want
646to forward to a method in another controller, or the main application,
647you will have to refer to the method by absolute path.
cda8d1ac 648
649 $c->forward('/my/controller/action');
d08ced28 650 $c->forward('/default'); # calls default in main application
fc7ec1d9 651
d08ced28 652Here are some examples of how to forward to classes and methods.
fc7ec1d9 653
e3dc9d78 654 sub hello : Global {
5a8ed4fe 655 my ( $self, $c ) = @_;
e178a66a 656 $c->forward(qw/MyApp::Model::Hello say_hello/);
5a8ed4fe 657 }
fc7ec1d9 658
e3dc9d78 659 sub bye : Global {
5a8ed4fe 660 my ( $self, $c ) = @_;
e178a66a 661 $c->forward('MyApp::Model::Hello'); # no method: will try 'process'
5a8ed4fe 662 }
fc7ec1d9 663
e178a66a 664 package MyApp::Model::Hello;
fc7ec1d9 665
666 sub say_hello {
667 my ( $self, $c ) = @_;
66f6e959 668 $c->res->body('Hello World!');
fc7ec1d9 669 }
670
671 sub process {
672 my ( $self, $c ) = @_;
66f6e959 673 $c->res->body('Goodbye World!');
fc7ec1d9 674 }
675
d08ced28 676Note that C<forward> returns to the calling action and continues
13436c14 677processing after the action finishes. If you want all further processing
678in the calling action to stop, use C<detach> instead, which will execute
679the C<detach>ed action and not return to the calling sub. In both cases,
680Catalyst will automatically try to call process() if you omit the
681method.
fc7ec1d9 682
683=head3 Components
684
56d8daeb 685Catalyst has an uncommonly flexible component system. You can define as
cccc887d 686many L</Models>, L</Views>, and L</Controllers> as you like.
fc7ec1d9 687
56d8daeb 688All components must inherit from L<Catalyst::Base>, which provides a
689simple class structure and some common class methods like C<config> and
690C<new> (constructor).
fc7ec1d9 691
e178a66a 692 package MyApp::Controller::Catalog;
fc7ec1d9 693
694 use strict;
695 use base 'Catalyst::Base';
696
697 __PACKAGE__->config( foo => 'bar' );
698
699 1;
700
6b10c72b 701You don't have to C<use> or otherwise register Models, Views, and
702Controllers. Catalyst automatically discovers and instantiates them
703when you call C<setup> in the main application. All you need to do is
704put them in directories named for each Component type. Notice that you
705can use some very terse aliases for each one.
fc7ec1d9 706
707=over 4
708
4a6895ce 709=item * B<MyApp/Model/>
fc7ec1d9 710
4a6895ce 711=item * B<MyApp/M/>
fc7ec1d9 712
4a6895ce 713=item * B<MyApp/View/>
fc7ec1d9 714
4a6895ce 715=item * B<MyApp/V/>
fc7ec1d9 716
4a6895ce 717=item * B<MyApp/Controller/>
fc7ec1d9 718
4a6895ce 719=item * B<MyApp/C/>
fc7ec1d9 720
721=back
722
723=head4 Views
724
129cfe74 725To show how to define views, we'll use an already-existing base class for the
726L<Template Toolkit|Template>, L<Catalyst::View::TT>. All we need to do is
727inherit from this class:
fc7ec1d9 728
e178a66a 729 package MyApp::View::TT;
fc7ec1d9 730
731 use strict;
732 use base 'Catalyst::View::TT';
733
734 1;
735
b33ed88c 736(You can also generate this automatically by using the helper script:
737
738 script/myapp_create.pl view TT TT
739
fb9257c1 740where the first C<TT> tells the script that the name of the view should
741be C<TT>, and the second that it should be a Template Toolkit view.)
b33ed88c 742
129cfe74 743This gives us a process() method and we can now just do
e178a66a 744$c->forward('MyApp::View::TT') to render our templates. The base class
745makes process() implicit, so we don't have to say
746C<$c-E<gt>forward(qw/MyApp::View::TT process/)>.
fc7ec1d9 747
e3dc9d78 748 sub hello : Global {
5a8ed4fe 749 my ( $self, $c ) = @_;
750 $c->stash->{template} = 'hello.tt';
751 }
fc7ec1d9 752
5a8ed4fe 753 sub end : Private {
754 my ( $self, $c ) = @_;
e178a66a 755 $c->forward('MyApp::View::TT');
5a8ed4fe 756 }
fc7ec1d9 757
6b10c72b 758You normally render templates at the end of a request, so it's a perfect
759use for the global C<end> action.
fc7ec1d9 760
129cfe74 761Also, be sure to put the template under the directory specified in
6b10c72b 762C<$c-E<gt>config-E<gt>{root}>, or you'll be forced to look at our
763eyecandy debug screen. ;)
fc7ec1d9 764
765=head4 Models
766
e178a66a 767To show how to define models, again we'll use an already-existing base
e112461a 768class, this time for L<DBIx::Class>: L<Catalyst::Model::DBIC::Schema>.
769We'll also need L<DBIx::Class::Schema::Loader>.
fc7ec1d9 770
771But first, we need a database.
772
773 -- myapp.sql
774 CREATE TABLE foo (
775 id INTEGER PRIMARY KEY,
776 data TEXT
777 );
778
779 CREATE TABLE bar (
780 id INTEGER PRIMARY KEY,
781 foo INTEGER REFERENCES foo,
782 data TEXT
783 );
784
785 INSERT INTO foo (data) VALUES ('TEST!');
786
787
788 % sqlite /tmp/myapp.db < myapp.sql
789
e112461a 790Now we can create a DBIC::SchemaLoader component for this database.
fc7ec1d9 791
e112461a 792 script/myapp_create.pl model DBIC DBIC::SchemaLoader 'dbi:SQLite:/tmp/myapp.db'
fc7ec1d9 793
e112461a 794L<DBIx::Class::Schema::Loader> automatically loads table layouts and
795relationships. Use the stash to pass data to your templates.
fc7ec1d9 796
e112461a 797We add the following to MyApp/Controller/Root.pm
b248fa4a 798
e112461a 799 sub view : Global {
800 my ( $self, $c, $id ) = @_;
801
802 $c->stash->{item} = $c->model('DBIC::Foo')->find($id);
803 }
fc7ec1d9 804
e112461a 805 1;
806
5a8ed4fe 807 sub end : Private {
808 my ( $self, $c ) = @_;
e112461a 809
5a8ed4fe 810 $c->stash->{template} ||= 'index.tt';
e112461a 811 $c->forward( $c->view('TT') );
5a8ed4fe 812 }
fc7ec1d9 813
e112461a 814We then create a new template file "root/index.tt" containing:
fc7ec1d9 815
e112461a 816 The Id's data is [% item.data %]
fc7ec1d9 817
6b10c72b 818Models do not have to be part of your Catalyst application; you
819can always call an outside module that serves as your Model:
820
821 # in a Controller
822 sub list : Local {
823 my ( $self, $c ) = @_;
e112461a 824
6b10c72b 825 $c->stash->{template} = 'list.tt';
e112461a 826
827 use Some::Outside::DBIC::Module;
828 my @records = Some::Outside::DBIC::Module->search({
829 artist => 'sri',
830 });
831
6b10c72b 832 $c->stash->{records} = \@records;
833 }
834
835But by using a Model that is part of your Catalyst application, you gain
836several things: you don't have to C<use> each component, Catalyst will
837find and load it automatically at compile-time; you can C<forward> to
26e73131 838the module, which can only be done to Catalyst components; and only
6b10c72b 839Catalyst components can be fetched with
e178a66a 840C<$c-E<gt>model('SomeModel')>.
6b10c72b 841
842Happily, since many people have existing Model classes that they
843would like to use with Catalyst (or, conversely, they want to
844write Catalyst models that can be used outside of Catalyst, e.g.
845in a cron job), it's trivial to write a simple component in
846Catalyst that slurps in an outside Model:
847
e112461a 848 package MyApp::Model::DB;
849 use base qw/Catalyst::Model::DBIC::Schema/;
850 __PACKAGE__->config(
851 schema_class => 'Some::DBIC::Schema',
cccc887d 852 connect_info => ['dbi:SQLite:foo.db', '', '', {AutoCommit=>1}]
e112461a 853 );
6b10c72b 854 1;
855
e112461a 856and that's it! Now C<Some::DBIC::Schema> is part of your
857Cat app as C<MyApp::Model::DB>.
6b10c72b 858
fc7ec1d9 859=head4 Controllers
860
129cfe74 861Multiple controllers are a good way to separate logical domains of your
862application.
fc7ec1d9 863
e178a66a 864 package MyApp::Controller::Login;
fc7ec1d9 865
fb9257c1 866 sub sign-in : Local { }
867 sub new-password : Local { }
868 sub sign-out : Local { }
fc7ec1d9 869
e178a66a 870 package MyApp::Controller::Catalog;
fc7ec1d9 871
e3dc9d78 872 sub view : Local { }
873 sub list : Local { }
fc7ec1d9 874
e178a66a 875 package MyApp::Controller::Cart;
fc7ec1d9 876
e3dc9d78 877 sub add : Local { }
878 sub update : Local { }
879 sub order : Local { }
fc7ec1d9 880
881=head3 Testing
882
e178a66a 883Catalyst has a built-in http server for testing! (Later, you can easily
884use a more powerful server, e.g. Apache/mod_perl, in a production
885environment.)
fc7ec1d9 886
887Start your application on the command line...
888
b33ed88c 889 script/myapp_server.pl
fc7ec1d9 890
891...then visit http://localhost:3000/ in a browser to view the output.
892
893You can also do it all from the command line:
894
b33ed88c 895 script/myapp_test.pl http://localhost/
fc7ec1d9 896
897Have fun!
898
3cb1db8c 899=head1 SUPPORT
900
901IRC:
902
903 Join #catalyst on irc.perl.org.
904
72d9bfc7 905Mailing-lists:
3cb1db8c 906
907 http://lists.rawmode.org/mailman/listinfo/catalyst
908 http://lists.rawmode.org/mailman/listinfo/catalyst-dev
909
fc7ec1d9 910=head1 AUTHOR
911
cda8d1ac 912Sebastian Riedel, C<sri@oook.de>
913David Naughton, C<naughton@umn.edu>
914Marcus Ramberg, C<mramberg@cpan.org>
f531dd37 915Jesse Sheidlower, C<jester@panix.com>
129cfe74 916Danijel Milicevic, C<me@danijel.de>
fc7ec1d9 917
918=head1 COPYRIGHT
919
aa2b0d97 920This program is free software, you can redistribute it and/or modify it
921under the same terms as Perl itself.