added actions-paths-from-config
[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
baf5120b 426=item * B<Args>
427
428Args is not an action type per se, but an action modifier - it adds a match
429restriction to any action it's provided to, requiring only as many path parts
430as are specified for the action to be valid - for example in
431MyApp::Controller::Foo,
432
433 sub bar :Local
434
435would match any URL starting /foo/bar/. To restrict this you can do
436
437 sub bar :Local :Args(1)
438
439to only match /foo/bar/*/
440
fc7ec1d9 441=back
442
b33ed88c 443B<Note:> After seeing these examples, you probably wonder what the point
56d8daeb 444is of defining names for regex and path actions. Every public action is
445also a private one, so you have one unified way of addressing components
446in your C<forward>s.
cda8d1ac 447
72d9bfc7 448=head4 Built-in Private Actions
fc7ec1d9 449
fc9c8698 450In response to specific application states, Catalyst will automatically
451call these built-in private actions in your application class:
fc7ec1d9 452
453=over 4
454
cda8d1ac 455=item * B<default : Private>
fc7ec1d9 456
fc9c8698 457Called when no other action matches. Could be used, for example, for
458displaying a generic frontpage for the main app, or an error page for
459individual controllers.
fc7ec1d9 460
0cf56dbc 461If C<default> isn't acting how you would expect, look at using a
cccc887d 462L</Literal> C<Path> action (with an empty path string). The difference is
e178a66a 463that C<Path> takes arguments relative from the namespace and C<default>
464I<always> takes arguments relative from the root, regardless of what
465controller it's in.
0cf56dbc 466
66f6e959 467=item * B<index : Private>
468
469C<index> is much like C<default> except that it takes no arguments
e178a66a 470and it is weighted slightly higher in the matching process. It is
471useful as a static entry point to a controller, e.g. to have a static
61a9002d 472welcome page. Note that it's also weighted higher than Path.
66f6e959 473
cda8d1ac 474=item * B<begin : Private>
fc7ec1d9 475
fc9c8698 476Called at the beginning of a request, before any matching actions are
477called.
fc7ec1d9 478
cda8d1ac 479=item * B<end : Private>
4a6895ce 480
fc7ec1d9 481Called at the end of a request, after all matching actions are called.
482
fc9c8698 483=back
484
6b10c72b 485=head4 Built-in actions in controllers/autochaining
fc7ec1d9 486
e178a66a 487 Package MyApp::Controller::Foo;
cda8d1ac 488 sub begin : Private { }
5a8ed4fe 489 sub default : Private { }
eff5f524 490 sub auto : Private { }
fc7ec1d9 491
fc9c8698 492You can define built-in private actions within your controllers as
493well. The actions will override the ones in less-specific controllers,
494or your application class. In other words, for each of the three
495built-in private actions, only one will be run in any request
e178a66a 496cycle. Thus, if C<MyApp::Controller::Catalog::begin> exists, it will be
497run in place of C<MyApp::begin> if you're in the C<catalog> namespace,
498and C<MyApp::Controller::Catalog::Order::begin> would override this in
499turn.
fc9c8698 500
eff5f524 501In addition to the normal built-in actions, you have a special action
502for making chains, C<auto>. Such C<auto> actions will be run after any
fc9c8698 503C<begin>, but before your action is processed. Unlike the other
eff5f524 504built-ins, C<auto> actions I<do not> override each other; they will be
505called in turn, starting with the application class and going through to
506the I<most> specific class. I<This is the reverse of the order in which
507the normal built-ins override each other>.
fc9c8698 508
509Here are some examples of the order in which the various built-ins
510would be called:
cda8d1ac 511
512=over 4
513
fc9c8698 514=item for a request for C</foo/foo>
cda8d1ac 515
516 MyApp::begin
80ef2e6d 517 MyApp::auto
e178a66a 518 MyApp::Controller::Foo::default # in the absence of MyApp::Controller::Foo::Foo
cda8d1ac 519 MyApp::end
520
fc9c8698 521=item for a request for C</foo/bar/foo>
cda8d1ac 522
e178a66a 523 MyApp::Controller::Foo::Bar::begin
80ef2e6d 524 MyApp::auto
e178a66a 525 MyApp::Controller::Foo::auto
526 MyApp::Controller::Foo::Bar::auto
527 MyApp::Controller::Foo::Bar::default # for MyApp::Controller::Foo::Bar::foo
528 MyApp::Controller::Foo::Bar::end
80ef2e6d 529
530=back
531
fc9c8698 532The C<auto> action is also distinguished by the fact that you can break
533out of the processing chain by returning 0. If an C<auto> action returns
5340, any remaining actions will be skipped, except for C<end>. So, for the
535request above, if the first auto returns false, the chain would look
536like this:
80ef2e6d 537
538=over 4
539
fc9c8698 540=item for a request for C</foo/bar/foo> where first C<auto> returns
541false
80ef2e6d 542
e178a66a 543 MyApp::Controller::Foo::Bar::begin
80ef2e6d 544 MyApp::auto
e178a66a 545 MyApp::Controller::Foo::Bar::end
cda8d1ac 546
547=back
4a6895ce 548
fc9c8698 549An example of why one might use this is an authentication action: you
550could set up a C<auto> action to handle authentication in your
551application class (which will always be called first), and if
552authentication fails, returning 0 would skip any remaining methods
553for that URL.
03805733 554
fc9c8698 555B<Note:> Looking at it another way, C<auto> actions have to return a
556true value to continue processing! You can also C<die> in the autochain
557action; in that case, the request will go straight to the finalize
558stage, without processing further actions.
03805733 559
6b10c72b 560=head4 URL Path Handling
4a6895ce 561
70d5ae49 562You can pass variable arguments as part of the URL path, separated with
563forward slashes (/). If the action is a Regex or LocalRegex, the '$' anchor
564must be used. For example, suppose you want to handle C</foo/$bar/$baz>,
565where C<$bar> and C<$baz> may vary:
4a6895ce 566
cda8d1ac 567 sub foo : Regex('^foo$') { my ($self, $context, $bar, $baz) = @_; }
4a6895ce 568
fc9c8698 569But what if you also defined actions for C</foo/boo> and C</foo/boo/hoo>?
4a6895ce 570
f29c48dd 571 sub boo : Path('foo/boo') { .. }
572 sub hoo : Path('foo/boo/hoo') { .. }
4a6895ce 573
574Catalyst matches actions in most specific to least specific order:
575
576 /foo/boo/hoo
577 /foo/boo
fc9c8698 578 /foo # might be /foo/bar/baz but won't be /foo/boo/hoo
4a6895ce 579
fc9c8698 580So Catalyst would never mistakenly dispatch the first two URLs to the
581'^foo$' action.
fc7ec1d9 582
70d5ae49 583If a Regex or LocalRegex action doesn't use the '$' anchor, the action will
584still match a URL containing arguments, however the arguments won't be
585available via C<@_>.
586
6b10c72b 587=head4 Parameter Processing
2ef2fb0f 588
fc9c8698 589Parameters passed in the URL query string are handled with methods in
590the L<Catalyst::Request> class. The C<param> method is functionally
591equivalent to the C<param> method of C<CGI.pm> and can be used in
592modules that require this.
2ef2fb0f 593
594 # http://localhost:3000/catalog/view/?category=hardware&page=3
595 my $category = $c->req->param('category');
596 my $current_page = $c->req->param('page') || 1;
597
598 # multiple values for single parameter name
599 my @values = $c->req->param('scrolling_list');
600
601 # DFV requires a CGI.pm-like input hash
602 my $results = Data::FormValidator->check($c->req->params, \%dfv_profile);
603
fc7ec1d9 604=head3 Flow Control
605
d08ced28 606You control the application flow with the C<forward> method, which
607accepts the key of an action to execute. This can be an action in the
608same or another Catalyst controller, or a Class name, optionally
609followed by a method name. After a C<forward>, the control flow will
610return to the method from which the C<forward> was issued.
611
612A C<forward> is similar to a method call. The main differences are that
613it wraps the call in an C<eval> to allow exception handling; it
614automatically passes along the context object (C<$c> or C<$context>);
615and it allows profiling of each call (displayed in the log with
616debugging enabled).
fc7ec1d9 617
e3dc9d78 618 sub hello : Global {
5a8ed4fe 619 my ( $self, $c ) = @_;
620 $c->stash->{message} = 'Hello World!';
d08ced28 621 $c->forward('check_message'); # $c is automatically included
5a8ed4fe 622 }
fc7ec1d9 623
4c6807d2 624 sub check_message : Private {
5a8ed4fe 625 my ( $self, $c ) = @_;
626 return unless $c->stash->{message};
4c6807d2 627 $c->forward('show_message');
5a8ed4fe 628 }
fc7ec1d9 629
4c6807d2 630 sub show_message : Private {
5a8ed4fe 631 my ( $self, $c ) = @_;
66f6e959 632 $c->res->body( $c->stash->{message} );
5a8ed4fe 633 }
3323f920 634
d08ced28 635A C<forward> does not create a new request, so your request
636object (C<$c-E<gt>req>) will remain unchanged. This is a
637key difference between using C<forward> and issuing a
638redirect.
3323f920 639
d08ced28 640You can pass new arguments to a C<forward> by adding them
641in an anonymous array. In this case C<$c-E<gt>req-E<gt>args>
642will be changed for the duration of the C<forward> only; upon
643return, the original value of C<$c-E<gt>req-E<gt>args> will
644be reset.
3323f920 645
646 sub hello : Global {
647 my ( $self, $c ) = @_;
648 $c->stash->{message} = 'Hello World!';
d08ced28 649 $c->forward('check_message',[qw/test1/]);
650 # now $c->req->args is back to what it was before
3323f920 651 }
652
d08ced28 653 sub check_message : Private {
654 my ( $self, $c ) = @_;
fabf3a10 655 my $first_argument = $c->req->args->[0]; # now = 'test1'
d08ced28 656 # do something...
657 }
b248fa4a 658
d08ced28 659As you can see from these examples, you can just use the method name as
660long as you are referring to methods in the same controller. If you want
661to forward to a method in another controller, or the main application,
662you will have to refer to the method by absolute path.
cda8d1ac 663
664 $c->forward('/my/controller/action');
d08ced28 665 $c->forward('/default'); # calls default in main application
fc7ec1d9 666
d08ced28 667Here are some examples of how to forward to classes and methods.
fc7ec1d9 668
e3dc9d78 669 sub hello : Global {
5a8ed4fe 670 my ( $self, $c ) = @_;
e178a66a 671 $c->forward(qw/MyApp::Model::Hello say_hello/);
5a8ed4fe 672 }
fc7ec1d9 673
e3dc9d78 674 sub bye : Global {
5a8ed4fe 675 my ( $self, $c ) = @_;
e178a66a 676 $c->forward('MyApp::Model::Hello'); # no method: will try 'process'
5a8ed4fe 677 }
fc7ec1d9 678
e178a66a 679 package MyApp::Model::Hello;
fc7ec1d9 680
681 sub say_hello {
682 my ( $self, $c ) = @_;
66f6e959 683 $c->res->body('Hello World!');
fc7ec1d9 684 }
685
686 sub process {
687 my ( $self, $c ) = @_;
66f6e959 688 $c->res->body('Goodbye World!');
fc7ec1d9 689 }
690
d08ced28 691Note that C<forward> returns to the calling action and continues
13436c14 692processing after the action finishes. If you want all further processing
693in the calling action to stop, use C<detach> instead, which will execute
694the C<detach>ed action and not return to the calling sub. In both cases,
695Catalyst will automatically try to call process() if you omit the
696method.
fc7ec1d9 697
698=head3 Components
699
56d8daeb 700Catalyst has an uncommonly flexible component system. You can define as
cccc887d 701many L</Models>, L</Views>, and L</Controllers> as you like.
fc7ec1d9 702
56d8daeb 703All components must inherit from L<Catalyst::Base>, which provides a
704simple class structure and some common class methods like C<config> and
705C<new> (constructor).
fc7ec1d9 706
e178a66a 707 package MyApp::Controller::Catalog;
fc7ec1d9 708
709 use strict;
710 use base 'Catalyst::Base';
711
712 __PACKAGE__->config( foo => 'bar' );
713
714 1;
715
6b10c72b 716You don't have to C<use> or otherwise register Models, Views, and
717Controllers. Catalyst automatically discovers and instantiates them
718when you call C<setup> in the main application. All you need to do is
719put them in directories named for each Component type. Notice that you
720can use some very terse aliases for each one.
fc7ec1d9 721
722=over 4
723
4a6895ce 724=item * B<MyApp/Model/>
fc7ec1d9 725
4a6895ce 726=item * B<MyApp/M/>
fc7ec1d9 727
4a6895ce 728=item * B<MyApp/View/>
fc7ec1d9 729
4a6895ce 730=item * B<MyApp/V/>
fc7ec1d9 731
4a6895ce 732=item * B<MyApp/Controller/>
fc7ec1d9 733
4a6895ce 734=item * B<MyApp/C/>
fc7ec1d9 735
736=back
737
738=head4 Views
739
129cfe74 740To show how to define views, we'll use an already-existing base class for the
741L<Template Toolkit|Template>, L<Catalyst::View::TT>. All we need to do is
742inherit from this class:
fc7ec1d9 743
e178a66a 744 package MyApp::View::TT;
fc7ec1d9 745
746 use strict;
747 use base 'Catalyst::View::TT';
748
749 1;
750
b33ed88c 751(You can also generate this automatically by using the helper script:
752
753 script/myapp_create.pl view TT TT
754
fb9257c1 755where the first C<TT> tells the script that the name of the view should
756be C<TT>, and the second that it should be a Template Toolkit view.)
b33ed88c 757
129cfe74 758This gives us a process() method and we can now just do
e178a66a 759$c->forward('MyApp::View::TT') to render our templates. The base class
760makes process() implicit, so we don't have to say
761C<$c-E<gt>forward(qw/MyApp::View::TT process/)>.
fc7ec1d9 762
e3dc9d78 763 sub hello : Global {
5a8ed4fe 764 my ( $self, $c ) = @_;
765 $c->stash->{template} = 'hello.tt';
766 }
fc7ec1d9 767
5a8ed4fe 768 sub end : Private {
769 my ( $self, $c ) = @_;
e178a66a 770 $c->forward('MyApp::View::TT');
5a8ed4fe 771 }
fc7ec1d9 772
6b10c72b 773You normally render templates at the end of a request, so it's a perfect
774use for the global C<end> action.
fc7ec1d9 775
129cfe74 776Also, be sure to put the template under the directory specified in
6b10c72b 777C<$c-E<gt>config-E<gt>{root}>, or you'll be forced to look at our
778eyecandy debug screen. ;)
fc7ec1d9 779
780=head4 Models
781
e178a66a 782To show how to define models, again we'll use an already-existing base
e112461a 783class, this time for L<DBIx::Class>: L<Catalyst::Model::DBIC::Schema>.
784We'll also need L<DBIx::Class::Schema::Loader>.
fc7ec1d9 785
786But first, we need a database.
787
788 -- myapp.sql
789 CREATE TABLE foo (
790 id INTEGER PRIMARY KEY,
791 data TEXT
792 );
793
794 CREATE TABLE bar (
795 id INTEGER PRIMARY KEY,
796 foo INTEGER REFERENCES foo,
797 data TEXT
798 );
799
800 INSERT INTO foo (data) VALUES ('TEST!');
801
802
803 % sqlite /tmp/myapp.db < myapp.sql
804
e112461a 805Now we can create a DBIC::SchemaLoader component for this database.
fc7ec1d9 806
e112461a 807 script/myapp_create.pl model DBIC DBIC::SchemaLoader 'dbi:SQLite:/tmp/myapp.db'
fc7ec1d9 808
e112461a 809L<DBIx::Class::Schema::Loader> automatically loads table layouts and
810relationships. Use the stash to pass data to your templates.
fc7ec1d9 811
e112461a 812We add the following to MyApp/Controller/Root.pm
b248fa4a 813
e112461a 814 sub view : Global {
815 my ( $self, $c, $id ) = @_;
816
817 $c->stash->{item} = $c->model('DBIC::Foo')->find($id);
818 }
fc7ec1d9 819
e112461a 820 1;
821
5a8ed4fe 822 sub end : Private {
823 my ( $self, $c ) = @_;
e112461a 824
5a8ed4fe 825 $c->stash->{template} ||= 'index.tt';
e112461a 826 $c->forward( $c->view('TT') );
5a8ed4fe 827 }
fc7ec1d9 828
e112461a 829We then create a new template file "root/index.tt" containing:
fc7ec1d9 830
e112461a 831 The Id's data is [% item.data %]
fc7ec1d9 832
6b10c72b 833Models do not have to be part of your Catalyst application; you
834can always call an outside module that serves as your Model:
835
836 # in a Controller
837 sub list : Local {
838 my ( $self, $c ) = @_;
e112461a 839
6b10c72b 840 $c->stash->{template} = 'list.tt';
e112461a 841
842 use Some::Outside::DBIC::Module;
843 my @records = Some::Outside::DBIC::Module->search({
844 artist => 'sri',
845 });
846
6b10c72b 847 $c->stash->{records} = \@records;
848 }
849
850But by using a Model that is part of your Catalyst application, you gain
851several things: you don't have to C<use> each component, Catalyst will
852find and load it automatically at compile-time; you can C<forward> to
26e73131 853the module, which can only be done to Catalyst components; and only
6b10c72b 854Catalyst components can be fetched with
e178a66a 855C<$c-E<gt>model('SomeModel')>.
6b10c72b 856
857Happily, since many people have existing Model classes that they
858would like to use with Catalyst (or, conversely, they want to
859write Catalyst models that can be used outside of Catalyst, e.g.
860in a cron job), it's trivial to write a simple component in
861Catalyst that slurps in an outside Model:
862
e112461a 863 package MyApp::Model::DB;
864 use base qw/Catalyst::Model::DBIC::Schema/;
865 __PACKAGE__->config(
866 schema_class => 'Some::DBIC::Schema',
cccc887d 867 connect_info => ['dbi:SQLite:foo.db', '', '', {AutoCommit=>1}]
e112461a 868 );
6b10c72b 869 1;
870
e112461a 871and that's it! Now C<Some::DBIC::Schema> is part of your
872Cat app as C<MyApp::Model::DB>.
6b10c72b 873
fc7ec1d9 874=head4 Controllers
875
129cfe74 876Multiple controllers are a good way to separate logical domains of your
877application.
fc7ec1d9 878
e178a66a 879 package MyApp::Controller::Login;
fc7ec1d9 880
c02f7490 881 use base qw/Catalyst::Controller/;
882
883 sub sign_in : Path("sign-in") { }
884 sub new_password : Path("new-password") { }
885 sub sign_out : Path("sign-out") { }
fc7ec1d9 886
e178a66a 887 package MyApp::Controller::Catalog;
fc7ec1d9 888
c02f7490 889 use base qw/Catalyst::Controller/;
890
e3dc9d78 891 sub view : Local { }
892 sub list : Local { }
fc7ec1d9 893
e178a66a 894 package MyApp::Controller::Cart;
fc7ec1d9 895
c02f7490 896 use base qw/Catalyst::Controller/;
897
e3dc9d78 898 sub add : Local { }
899 sub update : Local { }
900 sub order : Local { }
fc7ec1d9 901
c02f7490 902Note that you can also supply attributes via the Controller's config so long
903as you have at least one attribute on a subref to be exported (:Action is
904commonly used for this) - for example the following is equivalent to the same
905controller above
906
907 package MyApp::Controller::Login;
908
909 use base qw/Catalyst::Controller/;
910
911 __PACKAGE__->config(
912 actions => {
913 'sign_in' => { Path => 'sign-in' },
914 'new_password' => { Path => 'new-password' },
915 'sign_out' => { Path => 'sign-out' },
916 },
917 );
918
919 sub sign_in : Action { }
920 sub new_password : Action { }
921 sub sign_out : Action { }
922
fc7ec1d9 923=head3 Testing
924
e178a66a 925Catalyst has a built-in http server for testing! (Later, you can easily
926use a more powerful server, e.g. Apache/mod_perl, in a production
927environment.)
fc7ec1d9 928
929Start your application on the command line...
930
b33ed88c 931 script/myapp_server.pl
fc7ec1d9 932
933...then visit http://localhost:3000/ in a browser to view the output.
934
935You can also do it all from the command line:
936
b33ed88c 937 script/myapp_test.pl http://localhost/
fc7ec1d9 938
939Have fun!
940
3cb1db8c 941=head1 SUPPORT
942
943IRC:
944
945 Join #catalyst on irc.perl.org.
946
72d9bfc7 947Mailing-lists:
3cb1db8c 948
949 http://lists.rawmode.org/mailman/listinfo/catalyst
950 http://lists.rawmode.org/mailman/listinfo/catalyst-dev
951
fc7ec1d9 952=head1 AUTHOR
953
cda8d1ac 954Sebastian Riedel, C<sri@oook.de>
955David Naughton, C<naughton@umn.edu>
956Marcus Ramberg, C<mramberg@cpan.org>
f531dd37 957Jesse Sheidlower, C<jester@panix.com>
129cfe74 958Danijel Milicevic, C<me@danijel.de>
fc7ec1d9 959
960=head1 COPYRIGHT
961
aa2b0d97 962This program is free software, you can redistribute it and/or modify it
963under the same terms as Perl itself.