Added ProxyPass ignores for static files. Removed
[catagits/Catalyst-Manual.git] / lib / Catalyst / Manual / Intro.pod
CommitLineData
cb93c9d7 1=head1 NAME
2
3Catalyst::Manual::Intro - Introduction to Catalyst
4
5=head1 DESCRIPTION
6
7This is a brief introduction to Catalyst. It explains the most important
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>.
11For a systematic step-by-step introduction to writing an application
12with Catalyst, see L<Catalyst::Manual::Tutorial>.
13
14=head2 What is Catalyst?
15
16Catalyst is an elegant web application framework, extremely flexible
792ad331 17yet extremely simple. It's similar to Ruby on Rails, Spring (Java), and
18L<Maypole|Maypole>, upon which it was originally based. Its most
19important design philosphy is to provide easy access to all the tools
20you need to develop web applications, with few restrictions on how you
21need to use these tools. However, this does mean that it is always
22possible to do things in a different way. Other web frameworks are
23I<initially> simpler to use, but achieve this by locking the programmer
24into a single set of tools. Catalyst's emphasis on flexibility means
25that you have to think more to use it. We view this as a feature. For
26example, this leads to Catalyst being more suited to system integration
27tasks than other web frameworks.
cb93c9d7 28
29=head3 MVC
30
31Catalyst follows the Model-View-Controller (MVC) design pattern,
32allowing you to easily separate concerns, like content, presentation,
33and flow control, into separate modules. This separation allows you to
34modify code that handles one concern without affecting code that handles
35the others. Catalyst promotes the re-use of existing Perl modules that
36already handle common web application concerns well.
37
38Here's how the Model, View, and Controller map to those concerns, with
39examples of well-known Perl modules you may want to use for each.
40
41=over 4
42
43=item * B<Model>
44
45Access and modify content (data). L<DBIx::Class>, L<Class::DBI>,
46L<Xapian>, L<Net::LDAP>...
47
48=item * B<View>
49
50Present content to the user. L<Template Toolkit|Template>,
51L<Mason|HTML::Mason>, L<HTML::Template>...
52
53=item * B<Controller>
54
55Control the whole request phase, check parameters, dispatch actions, flow
56control. Catalyst itself!
57
58=back
59
60If you're unfamiliar with MVC and design patterns, you may want to
61check out the original book on the subject, I<Design Patterns>, by
62Gamma, Helm, Johnson, and Vlissides, also known as the Gang of Four
63(GoF). Many, many web application frameworks are based on MVC, which
64is becoming a popular design paradigm for the world wide web.
65
66=head3 Flexibility
67
68Catalyst is much more flexible than many other frameworks. Rest assured
69you can use your favorite Perl modules with Catalyst.
70
71=over 4
72
73=item * B<Multiple Models, Views, and Controllers>
74
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.
84
85=item * B<Reuseable Components>
86
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.
90
91=item * B<Unrestrained URL-to-Action Dispatching>
92
93Catalyst allows you to dispatch any URLs to any application L</Actions>,
94even through regular expressions! Unlike most other frameworks, it
95doesn't require mod_rewrite or class and method names in URLs.
96
97With Catalyst you register your actions and address them directly. For
98example:
99
100 sub hello : Global {
101 my ( $self, $context ) = @_;
102 $context->response->body('Hello World!');
103 }
104
105Now http://localhost:3000/hello prints "Hello World!".
106
4299d9f5 107Note that actions with the C< :Local > attribute are equivalent to
108using a C<:Path('/action_name') > attribute (note the leading slash).
109So our action could be equivalently:
110
111 sub hello : Path('/hello') {
112 my ( $self, $context ) = @_;
113 $context->response->body('Hello World!');
114 }
115
116
cb93c9d7 117=item * B<Support for CGI, mod_perl, Apache::Request, FastCGI>
118
119Use L<Catalyst::Engine::Apache> or L<Catalyst::Engine::CGI>. Other
120engines are also available.
121
122=back
123
124=head3 Simplicity
125
126The best part is that Catalyst implements all this flexibility in a very
127simple way.
128
129=over 4
130
131=item * B<Building Block Interface>
132
133Components interoperate very smoothly. For example, Catalyst
134automatically makes a L</Context> object available to every
135component. Via the context, you can access the request object, share
136data between components, and control the flow of your
137application. Building a Catalyst application feels a lot like snapping
138together toy building blocks, and everything just works.
139
140=item * B<Component Auto-Discovery>
141
142No need to C<use> all of your components. Catalyst automatically finds
143and loads them.
144
145=item * B<Pre-Built Components for Popular Modules>
146
147See L<Catalyst::Model::DBIC::Schema> for L<DBIx::Class>, or
148L<Catalyst::View::TT> for L<Template Toolkit|Template>.
149
150=item * B<Built-in Test Framework>
151
152Catalyst comes with a built-in, lightweight http server and test
153framework, making it easy to test applications from the web browser,
154and the command line.
155
156=item * B<Helper Scripts>
157
158Catalyst provides helper scripts to quickly generate running starter
159code for components and unit tests. Install L<Catalyst::Devel> and see
160L<Catalyst::Helper>.
161
162=back
163
164=head2 Quickstart
165
166Here's how to install Catalyst and get a simple application up and
167running, using the helper scripts described above.
168
169=head3 Install
170
171Installation of Catalyst can be a time-consuming and frustrating
172effort, due to its large number of dependencies. The easiest way
173to get up and running is to use Matt Trout's C<cat-install>
174script, from L<http://www.shadowcatsystems.co.uk/static/cat-install>,
175and then install L<Catalyst::Devel>.
176
177 # perl cat-install
178 # perl -MCPAN -e 'install Catalyst::Devel'
179
180=head3 Setup
181
182 $ catalyst.pl MyApp
183 # output omitted
184 $ cd MyApp
185 $ script/myapp_create.pl controller Library::Login
186
187=head3 Run
188
189 $ script/myapp_server.pl
190
191Now visit these locations with your favorite browser or user agent to see
192Catalyst in action:
193
194(NOTE: Although we create a controller here, we don't actually use it.
195Both of these URLs should take you to the welcome page.)
196
197
198=over 4
199
200=item http://localhost:3000/
201
202=item http://localhost:3000/library/login/
203
204=back
205
206=head2 How It Works
207
208Let's see how Catalyst works, by taking a closer look at the components
209and other parts of a Catalyst application.
210
211=head3 Components
212
213Catalyst has an uncommonly flexible component system. You can define as
214many L</Models>, L</Views>, and L</Controllers> as you like. As discussed
215previously, the general idea is that the View is responsible for the
216output of data to the user (typically via a web browser, but a View can
217also generate PDFs or e-mails, for example); the Model is responsible
218for providing data (typically from a relational database); and the
219Controller is responsible for interacting with the user and deciding
220how user input determines what actions the application takes.
221
222In the world of MVC, there are frequent discussions and disagreements
223about the nature of each element - whether certain types of logic
224belong in the Model or the Controller, etc. Catalyst's flexibility
225means that this decision is entirely up to you, the programmer;
226Catalyst doesn't enforce anything. See L<Catalyst::Manual::About> for
227a general discussion of these issues.
228
b2aea8fe 229Model, View and Controller components must inherit from L<Catalyst::Model>,
47a79274 230L<Catalyst::View> and L<Catalyst::Controller>, respectively. These, in turn, inherit
b2aea8fe 231from L<Catalyst::Component> which provides a simple class structure and some
232common class methods like C<config> and C<new> (constructor).
cb93c9d7 233
234 package MyApp::Controller::Catalog;
235
236 use strict;
b2aea8fe 237 use base 'Catalyst::Controller';
cb93c9d7 238
239 __PACKAGE__->config( foo => 'bar' );
240
241 1;
242
243You don't have to C<use> or otherwise register Models, Views, and
244Controllers. Catalyst automatically discovers and instantiates them
245when you call C<setup> in the main application. All you need to do is
246put them in directories named for each Component type. You can use a
247short alias for each one.
248
249=over 4
250
251=item * B<MyApp/Model/>
252
253=item * B<MyApp/M/>
254
255=item * B<MyApp/View/>
256
257=item * B<MyApp/V/>
258
259=item * B<MyApp/Controller/>
260
261=item * B<MyApp/C/>
262
263=back
264
265In older versions of Catalyst, the recommended practice (and the one
266automatically created by helper scripts) was to name the directories
267C<M/>, C<V/>, and C<C/>. Though these still work, we now recommend
268the use of the full names.
269
270=head4 Views
271
272To show how to define views, we'll use an already-existing base class for the
273L<Template Toolkit|Template>, L<Catalyst::View::TT>. All we need to do is
274inherit from this class:
275
276 package MyApp::View::TT;
277
278 use strict;
279 use base 'Catalyst::View::TT';
280
281 1;
282
283(You can also generate this automatically by using the helper script:
284
285 script/myapp_create.pl view TT TT
286
287where the first C<TT> tells the script that the name of the view should
288be C<TT>, and the second that it should be a Template Toolkit view.)
289
290This gives us a process() method and we can now just do
291$c->forward('MyApp::View::TT') to render our templates. The base class
292makes process() implicit, so we don't have to say
293C<$c-E<gt>forward(qw/MyApp::View::TT process/)>.
294
295 sub hello : Global {
296 my ( $self, $c ) = @_;
297 $c->stash->{template} = 'hello.tt';
298 }
299
300 sub end : Private {
301 my ( $self, $c ) = @_;
302 $c->forward( $c->view('TT') );
303 }
304
305You normally render templates at the end of a request, so it's a perfect
306use for the global C<end> action.
307
308In practice, however, you would use a default C<end> action as supplied
309by L<Catalyst::Action::RenderView>.
310
311Also, be sure to put the template under the directory specified in
312C<$c-E<gt>config-E<gt>{root}>, or you'll end up looking at the debug
313screen.
314
315=head4 Models
316
317Models are providers of data. This data could come from anywhere - a
318search engine index, a spreadsheet, the file system - but typically a
319Model represents a database table. The data source does not
320intrinsically have much to do with web applications or Catalyst - it
321could just as easily be used to write an offline report generator or a
322command-line tool.
323
324To show how to define models, again we'll use an already-existing base
325class, this time for L<DBIx::Class>: L<Catalyst::Model::DBIC::Schema>.
326We'll also need L<DBIx::Class::Schema::Loader>.
327
328But first, we need a database.
329
330 -- myapp.sql
331 CREATE TABLE foo (
332 id INTEGER PRIMARY KEY,
333 data TEXT
334 );
335
336 CREATE TABLE bar (
337 id INTEGER PRIMARY KEY,
338 foo INTEGER REFERENCES foo,
339 data TEXT
340 );
341
342 INSERT INTO foo (data) VALUES ('TEST!');
343
9d49ae04 344 % sqlite3 /tmp/myapp.db < myapp.sql
cb93c9d7 345
346Now we can create a DBIC::Schema model for this database.
347
348 script/myapp_create.pl model MyModel DBIC::Schema MySchema create=static 'dbi:SQLite:/tmp/myapp.db'
349
4299d9f5 350L<DBIx::Class::Schema::Loader> can automaticall load table layouts and
351relationships, and convert them into a static schema definition
352C<MySchema>, which you can edit later.
cb93c9d7 353
354Use the stash to pass data to your templates.
355
356We add the following to MyApp/Controller/Root.pm
357
358 sub view : Global {
359 my ( $self, $c, $id ) = @_;
360
361 $c->stash->{item} = $c->model('MyModel::Foo')->find($id);
362 }
363
364 1;
365
366 sub end : Private {
367 my ( $self, $c ) = @_;
368
369 $c->stash->{template} ||= 'index.tt';
370 $c->forward( $c->view('TT') );
371 }
372
373We then create a new template file "root/index.tt" containing:
374
375 The Id's data is [% item.data %]
376
377Models do not have to be part of your Catalyst application; you
378can always call an outside module that serves as your Model:
379
380 # in a Controller
381 sub list : Local {
382 my ( $self, $c ) = @_;
383
384 $c->stash->{template} = 'list.tt';
385
386 use Some::Outside::Database::Module;
387 my @records = Some::Outside::Database::Module->search({
388 artist => 'Led Zeppelin',
389 });
390
391 $c->stash->{records} = \@records;
392 }
393
394But by using a Model that is part of your Catalyst application, you
395gain several things: you don't have to C<use> each component, Catalyst
396will find and load it automatically at compile-time; you can
397C<forward> to the module, which can only be done to Catalyst
398components. Only Catalyst components can be fetched with
399C<$c-E<gt>model('SomeModel')>.
400
401Happily, since many people have existing Model classes that they
402would like to use with Catalyst (or, conversely, they want to
403write Catalyst models that can be used outside of Catalyst, e.g.
404in a cron job), it's trivial to write a simple component in
405Catalyst that slurps in an outside Model:
406
407 package MyApp::Model::DB;
408 use base qw/Catalyst::Model::DBIC::Schema/;
409 __PACKAGE__->config(
410 schema_class => 'Some::DBIC::Schema',
411 connect_info => ['dbi:SQLite:foo.db', '', '', {AutoCommit=>1}]
412 );
413 1;
414
415and that's it! Now C<Some::DBIC::Schema> is part of your
416Cat app as C<MyApp::Model::DB>.
417
418Within Catalyst, the common approach to writing a model for your
419application is wrapping a generic model (e.g. L<DBIx::Class::Schema>, a
420bunch of XMLs, or anything really) with an object that contains
421configuration data, convenience methods, and so forth. Thus you
422will in effect have two models - a wrapper model that knows something
423about Catalyst and your web application, and a generic model that is
424totally independent of these needs.
425
426Technically, within Catalyst a model is a B<component> - an instance of
427the model's class belonging to the application. It is important to
428stress that the lifetime of these objects is per application, not per
429request.
430
431While the model base class (L<Catalyst::Model>) provides things like
432C<config> to better integrate the model into the application, sometimes
433this is not enough, and the model requires access to C<$c> itself.
434
435Situations where this need might arise include:
436
437=over 4
438
439=item *
440
441Interacting with another model
442
443=item *
444
445Using per-request data to control behavior
446
447=item *
448
449Using plugins from a Model (for example L<Catalyst::Plugin::Cache>).
450
451=back
452
453From a style perspective it's usually considered bad form to make your
454model "too smart" about things - it should worry about business logic
455and leave the integration details to the controllers. If, however, you
456find that it does not make sense at all to use an auxillary controller
457around the model, and the model's need to access C<$c> cannot be
458sidestepped, there exists a power tool called L</ACCEPT_CONTEXT>.
459
460=head4 Controllers
461
462Multiple controllers are a good way to separate logical domains of your
463application.
464
465 package MyApp::Controller::Login;
466
467 use base qw/Catalyst::Controller/;
468
469 sub login : Path("login") { }
470 sub new_password : Path("new-password") { }
471 sub logout : Path("logout") { }
472
473 package MyApp::Controller::Catalog;
474
475 use base qw/Catalyst::Controller/;
476
477 sub view : Local { }
478 sub list : Local { }
479
480 package MyApp::Controller::Cart;
481
482 use base qw/Catalyst::Controller/;
483
484 sub add : Local { }
485 sub update : Local { }
486 sub order : Local { }
487
488Note that you can also supply attributes via the Controller's config so
489long as you have at least one attribute on a subref to be exported
490(:Action is commonly used for this) - for example the following is
491equivalent to the same controller above:
492
493 package MyApp::Controller::Login;
494
495 use base qw/Catalyst::Controller/;
496
497 __PACKAGE__->config(
498 actions => {
499 'sign_in' => { Path => 'sign-in' },
500 'new_password' => { Path => 'new-password' },
501 'sign_out' => { Path => 'sign-out' },
502 },
503 );
504
505 sub sign_in : Action { }
506 sub new_password : Action { }
507 sub sign_out : Action { }
508
509=head3 ACCEPT_CONTEXT
510
511Whenever you call $c->component("Foo") you get back an object - the
512instance of the model. If the component supports the C<ACCEPT_CONTEXT>
513method instead of returning the model itself, the return value of C<<
514$model->ACCEPT_CONTEXT( $c ) >> will be used.
515
516This means that whenever your model/view/controller needs to talk to C<$c> it
517gets a chance to do this when it's needed.
518
519A typical C<ACCEPT_CONTEXT> method will either clone the model and return one
520with the context object set, or it will return a thin wrapper that contains
521C<$c> and delegates to the per-application model object.
522
523A typical C<ACCEPT_CONTEXT> method could look like this:
524
525 sub ACCEPT_CONTEXT {
526 my ( $self, $c, @extra_arguments ) = @_;
527 bless { %$self, c => $c }, ref($self);
528 }
529
530effectively treating $self as a B<prototype object> that gets a new parameter.
531C<@extra_arguments> comes from any trailing arguments to
532C<< $c->component( $bah, @extra_arguments ) >> (or C<< $c->model(...) >>,
533C<< $c->view(...) >> etc).
534
535The life time of this value is B<per usage>, and not per request. To make this
536per request you can use the following technique:
537
538Add a field to C<$c>, like C<my_model_instance>. Then write your
539C<ACCEPT_CONTEXT> method to look like this:
540
541 sub ACCEPT_CONTEXT {
542 my ( $self, $c ) = @_;
543
544 if ( my $per_request = $c->my_model_instance ) {
545 return $per_request;
546 } else {
547 my $new_instance = bless { %$self, c => $c }, ref($self);
548 Scalar::Util::weaken($new_instance->{c}); # or we have a circular reference
549 $c->my_model_instance( $new_instance );
550 return $new_instance;
551 }
552 }
553
554=head3 Application Class
555
556In addition to the Model, View, and Controller components, there's a
557single class that represents your application itself. This is where you
558configure your application, load plugins, and extend Catalyst.
559
560 package MyApp;
561
562 use strict;
ca7528df 563 use parent qw/Catalyst/;
564 __PACKAGE__->setup(qw/-Debug ConfigLoader Static::Simple/);
565 # note you can still use use Catalyst qw/@plugins/ instead of the
566 # above two lines
cb93c9d7 567 MyApp->config(
568 name => 'My Application',
569
570 # You can put anything else you want in here:
571 my_configuration_variable => 'something',
572 );
573 1;
574
575In older versions of Catalyst, the application class was where you put
576global actions. However, as of version 5.66, the recommended practice is
577to place such actions in a special Root controller (see L</Actions>,
578below), to avoid namespace collisions.
579
580=over 4
581
582=item * B<name>
583
584The name of your application.
585
586=back
587
588Optionally, you can specify a B<root> parameter for templates and static
589data. If omitted, Catalyst will try to auto-detect the directory's
590location. You can define as many parameters as you want for plugins or
591whatever you need. You can access them anywhere in your application via
592C<$context-E<gt>config-E<gt>{$param_name}>.
593
594=head3 Context
595
596Catalyst automatically blesses a Context object into your application
597class and makes it available everywhere in your application. Use the
598Context to directly interact with Catalyst and glue your L</Components>
599together. For example, if you need to use the Context from within a
600Template Toolkit template, it's already there:
601
602 <h1>Welcome to [% c.config.name %]!</h1>
603
604As illustrated in our URL-to-Action dispatching example, the Context is
605always the second method parameter, behind the Component object
606reference or class name itself. Previously we called it C<$context> for
607clarity, but most Catalyst developers just call it C<$c>:
608
609 sub hello : Global {
610 my ( $self, $c ) = @_;
611 $c->res->body('Hello World!');
612 }
613
614The Context contains several important objects:
615
616=over 4
617
618=item * L<Catalyst::Request>
619
620 $c->request
621 $c->req # alias
622
623The request object contains all kinds of request-specific information, like
624query parameters, cookies, uploads, headers, and more.
625
626 $c->req->params->{foo};
627 $c->req->cookies->{sessionid};
628 $c->req->headers->content_type;
629 $c->req->base;
630 $c->req->uri_with( { page = $pager->next_page } );
631
632=item * L<Catalyst::Response>
633
634 $c->response
635 $c->res # alias
636
637The response is like the request, but contains just response-specific
638information.
639
640 $c->res->body('Hello World');
641 $c->res->status(404);
642 $c->res->redirect('http://oook.de');
643
644=item * L<Catalyst::Config>
645
646 $c->config
647 $c->config->{root};
648 $c->config->{name};
649
650=item * L<Catalyst::Log>
651
652 $c->log
653 $c->log->debug('Something happened');
654 $c->log->info('Something you should know');
655
656=item * B<Stash>
657
658 $c->stash
659 $c->stash->{foo} = 'bar';
660 $c->stash->{baz} = {baz => 'qox'};
661 $c->stash->{fred} = [qw/wilma pebbles/];
662
663and so on.
664
665=back
666
667The last of these, the stash, is a universal hash for sharing data among
668application components. For an example, we return to our 'hello' action:
669
670 sub hello : Global {
671 my ( $self, $c ) = @_;
672 $c->stash->{message} = 'Hello World!';
673 $c->forward('show_message');
674 }
675
676 sub show_message : Private {
677 my ( $self, $c ) = @_;
678 $c->res->body( $c->stash->{message} );
679 }
680
681Note that the stash should be used only for passing data in an
682individual request cycle; it gets cleared at a new request. If you need
683to maintain persistent data, use a session. See
684L<Catalyst::Plugin::Session> for a comprehensive set of
685Catalyst-friendly session-handling tools.
686
687=head3 Actions
688
689A Catalyst controller is defined by its actions. An action is a
690subroutine with a special attribute. You've already seen some examples
691of actions in this document. The URL (for example
692http://localhost.3000/foo/bar) consists of two parts, the base
693(http://localhost:3000/ in this example) and the path (foo/bar). Please
694note that the trailing slash after the hostname[:port] always belongs to
695base and not to the action.
696
697=over 4
698
699=item * B<Application Wide Actions>
700
701Actions which are called at the root level of the application
702(e.g. http://localhost:3000/ ) go in MyApp::Controller::Root, like
703this:
704
705 package MyApp::Controller::Root;
706 use base 'Catalyst::Controller';
707 # Sets the actions in this controller to be registered with no prefix
708 # so they function identically to actions created in MyApp.pm
709 __PACKAGE__->config->{namespace} = '';
4299d9f5 710 sub default : Path {
cb93c9d7 711 my ( $self, $context ) = @_;
4299d9f5 712 $context->response->status(404);
713 $context->response->body('404 not found');
cb93c9d7 714 }
715 1;
716
717=back
718
719=head4 Action types
720
721Catalyst supports several types of actions:
722
723=over 4
724
725=item * B<Literal> (B<Path> actions)
726
727 package MyApp::Controller::My::Controller;
728 sub bar : Path('foo/bar') { }
729
730Literal C<Path> actions will act relative to their current
731namespace. The above example matches only
732http://localhost:3000/my/controller/foo/bar. If you start your path with
733a forward slash, it will match from the root. Example:
734
735 package MyApp::Controller::My::Controller;
736 sub bar : Path('/foo/bar') { }
737
738Matches only http://localhost:3000/foo/bar.
739
740 package MyApp::Controller::My::Controller;
741 sub bar : Path { }
742
743By leaving the C<Path> definition empty, it will match on the namespace
744root. The above code matches http://localhost:3000/my/controller.
745
746=item * B<Regex>
747
748 sub bar : Regex('^item(\d+)/order(\d+)$') { }
749
750Matches any URL that matches the pattern in the action key, e.g.
751http://localhost:3000/item23/order42. The '' around the regexp is
752optional, but perltidy likes it. :)
753
754Regex matches act globally, i.e. without reference to the namespace from
755which it is called, so that a C<bar> method in the
756C<MyApp::Controller::Catalog::Order::Process> namespace won't match any
757form of C<bar>, C<Catalog>, C<Order>, or C<Process> unless you
758explicitly put this in the regex. To achieve the above, you should
759consider using a C<LocalRegex> action.
760
761=item * B<LocalRegex>
762
763 sub bar : LocalRegex('^widget(\d+)$') { }
764
765LocalRegex actions act locally. If you were to use C<bar> in
766C<MyApp::Controller::Catalog>, the above example would match urls like
767http://localhost:3000/catalog/widget23.
768
769If you omit the "C<^>" from your regex, then it will match any depth
770from the controller and not immediately off of the controller name. The
771following example differs from the above code in that it will match
772http://localhost:3000/catalog/foo/widget23 as well.
773
774 package MyApp::Controller::Catalog;
775 sub bar : LocalRegex('widget(\d+)$') { }
776
777For both LocalRegex and Regex actions, if you use capturing parentheses
778to extract values within the matching URL, those values are available in
779the C<$c-E<gt>req-E<gt>captures> array. In the above example, "widget23"
780would capture "23" in the above example, and
781C<$c-E<gt>req-E<gt>captures-E<gt>[0]> would be "23". If you want to pass
782arguments at the end of your URL, you must use regex action keys. See
783L</URL Path Handling> below.
784
785=item * B<Top-level> (B<Global>)
786
787 package MyApp::Controller::Foo;
788 sub foo : Global { }
789
790Matches http://localhost:3000/foo. The function name is mapped
791directly to the application base. You can provide an equivalent
792function in this case by doing the following:
793
794 package MyApp::Controller::Root
795 sub foo : Local { }
796
797=item * B<Namespace-Prefixed> (B<Local>)
798
799 package MyApp::Controller::My::Controller;
800 sub foo : Local { }
801
802Matches http://localhost:3000/my/controller/foo.
803
804This action type indicates that the matching URL must be prefixed with a
805modified form of the component's class (package) name. This modified
806class name excludes the parts that have a pre-defined meaning in
807Catalyst ("MyApp::Controller" in the above example), replaces "::" with
808"/", and converts the name to lower case. See L</Components> for a full
809explanation of the pre-defined meaning of Catalyst component class
810names.
811
4299d9f5 812Note that actions with the C< :Local > attribute are equivalent to the
813<:Path('action_name') > so sub foo : Local { } is equivalent to -
814
815 sub foo : Path('foo') { }
816
cb93c9d7 817=item * B<Chained>
818
819Catalyst also provides a method to build and dispatch chains of actions,
820like
821
822 sub catalog : Chained : CaptureArgs(1) {
823 my ( $self, $c, $arg ) = @_;
824 ...
825 }
826
827 sub item : Chained('catalog') : Args(1) {
828 my ( $self, $c, $arg ) = @_;
829 ...
830 }
831
832to handle a C</catalog/*/item/*> path. For further information about this
833dispatch type, please see L<Catalyst::DispatchType::Chained>.
834
835=item * B<Private>
836
837 sub foo : Private { }
838
839Matches no URL, and cannot be executed by requesting a URL that
09f13e1d 840corresponds to the action key. Catalyst's :Private attribute is
841exclusive and doesn't work with other attributes (so will not work
842combined with Path or Chained attributes). With the exception of the
843C< index >, C< auto > and C< default > actions, Private actions can
844only be executed from inside a Catalyst application, by calling the
845C<forward> or C<detach> methods:
cb93c9d7 846
847 $c->forward('foo');
09f13e1d 848 # or
849 $c->detach('foo');
cb93c9d7 850
851See L</Flow Control> for a full explanation of C<forward>. Note that, as
852discussed there, when forwarding from another component, you must use
853the absolute path to the method, so that a private C<bar> method in your
854C<MyApp::Controller::Catalog::Order::Process> controller must, if called
855from elsewhere, be reached with
856C<$c-E<gt>forward('/catalog/order/process/bar')>.
857
858=item * B<Args>
859
860Args is not an action type per se, but an action modifier - it adds a
861match restriction to any action it's provided to, requiring only as many
862path parts as are specified for the action to be valid - for example in
863MyApp::Controller::Foo,
864
865 sub bar :Local
866
867would match any URL starting /foo/bar/. To restrict this you can do
868
869 sub bar :Local :Args(1)
870
871to only match /foo/bar/*/
872
873=back
874
875B<Note:> After seeing these examples, you probably wonder what the point
876is of defining names for regex and path actions. Every public action is
877also a private one, so you have one unified way of addressing components
878in your C<forward>s.
879
880=head4 Built-in Private Actions
881
882In response to specific application states, Catalyst will automatically
883call these built-in private actions in your application class:
884
885=over 4
886
4299d9f5 887=item * B<default : Path>
cb93c9d7 888
889Called when no other action matches. Could be used, for example, for
890displaying a generic frontpage for the main app, or an error page for
955bdf3d 891individual controllers. B<Note>: in older Catalyst applications you
892will see C<default : Private> which is roughly speaking equivalent.
cb93c9d7 893
cb93c9d7 894
4299d9f5 895=item * B<index : Path : Args (0) >
cb93c9d7 896
4299d9f5 897C<index> is much like C<default> except that it takes no arguments and
898it is weighted slightly higher in the matching process. It is useful
899as a static entry point to a controller, e.g. to have a static welcome
900page. Note that it's also weighted higher than Path. Actually the sub
901name C<index> can be called anything you want. The sub attributes are
955bdf3d 902what determines the behaviour of the action. B<Note>: in older
903Catalyst applications, you will see C<index : Private> used, which is
904roughly speaking equivalent.
cb93c9d7 905
906=item * B<begin : Private>
907
908Called at the beginning of a request, before any matching actions are
909called.
910
911=item * B<end : Private>
912
913Called at the end of a request, after all matching actions are called.
914
915=back
916
917=head4 Built-in actions in controllers/autochaining
918
919 Package MyApp::Controller::Foo;
920 sub begin : Private { }
4299d9f5 921 sub default : Path { }
cb93c9d7 922 sub auto : Private { }
923
924You can define built-in private actions within your controllers as
925well. The actions will override the ones in less-specific controllers,
926or your application class. In other words, for each of the three
927built-in private actions, only one will be run in any request
928cycle. Thus, if C<MyApp::Controller::Catalog::begin> exists, it will be
929run in place of C<MyApp::begin> if you're in the C<catalog> namespace,
930and C<MyApp::Controller::Catalog::Order::begin> would override this in
931turn.
932
933=over 4
934
935=item * B<auto : Private>
936
937In addition to the normal built-in actions, you have a special action
938for making chains, C<auto>. Such C<auto> actions will be run after any
939C<begin>, but before your action is processed. Unlike the other
940built-ins, C<auto> actions I<do not> override each other; they will be
941called in turn, starting with the application class and going through to
942the I<most> specific class. I<This is the reverse of the order in which
943the normal built-ins override each other>.
944
945=back
946
947Here are some examples of the order in which the various built-ins
948would be called:
949
950=over 4
951
952=item for a request for C</foo/foo>
953
954 MyApp::begin
955 MyApp::auto
956 MyApp::Controller::Foo::default # in the absence of MyApp::Controller::Foo::Foo
957 MyApp::end
958
959=item for a request for C</foo/bar/foo>
960
961 MyApp::Controller::Foo::Bar::begin
962 MyApp::auto
963 MyApp::Controller::Foo::auto
964 MyApp::Controller::Foo::Bar::auto
965 MyApp::Controller::Foo::Bar::default # for MyApp::Controller::Foo::Bar::foo
966 MyApp::Controller::Foo::Bar::end
967
968=back
969
970The C<auto> action is also distinguished by the fact that you can break
971out of the processing chain by returning 0. If an C<auto> action returns
9720, any remaining actions will be skipped, except for C<end>. So, for the
973request above, if the first auto returns false, the chain would look
974like this:
975
976=over 4
977
978=item for a request for C</foo/bar/foo> where first C<auto> returns
979false
980
981 MyApp::Controller::Foo::Bar::begin
982 MyApp::auto
983 MyApp::Controller::Foo::Bar::end
984
985=back
986
987An example of why one might use this is an authentication action: you
988could set up a C<auto> action to handle authentication in your
989application class (which will always be called first), and if
990authentication fails, returning 0 would skip any remaining methods
991for that URL.
992
993B<Note:> Looking at it another way, C<auto> actions have to return a
994true value to continue processing! You can also C<die> in the auto
995action; in that case, the request will go straight to the finalize
996stage, without processing further actions.
997
998=head4 URL Path Handling
999
1000You can pass variable arguments as part of the URL path, separated with
1001forward slashes (/). If the action is a Regex or LocalRegex, the '$' anchor
1002must be used. For example, suppose you want to handle C</foo/$bar/$baz>,
1003where C<$bar> and C<$baz> may vary:
1004
1005 sub foo : Regex('^foo$') { my ($self, $context, $bar, $baz) = @_; }
1006
1007But what if you also defined actions for C</foo/boo> and C</foo/boo/hoo>?
1008
1009 sub boo : Path('foo/boo') { .. }
1010 sub hoo : Path('foo/boo/hoo') { .. }
1011
1012Catalyst matches actions in most specific to least specific order:
1013
1014 /foo/boo/hoo
1015 /foo/boo
1016 /foo # might be /foo/bar/baz but won't be /foo/boo/hoo
1017
1018So Catalyst would never mistakenly dispatch the first two URLs to the
1019'^foo$' action.
1020
1021If a Regex or LocalRegex action doesn't use the '$' anchor, the action will
1022still match a URL containing arguments, however the arguments won't be
1023available via C<@_>.
1024
1025=head4 Parameter Processing
1026
1027Parameters passed in the URL query string are handled with methods in
1028the L<Catalyst::Request> class. The C<param> method is functionally
1029equivalent to the C<param> method of C<CGI.pm> and can be used in
1030modules that require this.
1031
1032 # http://localhost:3000/catalog/view/?category=hardware&page=3
1033 my $category = $c->req->param('category');
1034 my $current_page = $c->req->param('page') || 1;
1035
1036 # multiple values for single parameter name
1037 my @values = $c->req->param('scrolling_list');
1038
1039 # DFV requires a CGI.pm-like input hash
1040 my $results = Data::FormValidator->check($c->req->params, \%dfv_profile);
1041
1042=head3 Flow Control
1043
1044You control the application flow with the C<forward> method, which
1045accepts the key of an action to execute. This can be an action in the
1046same or another Catalyst controller, or a Class name, optionally
1047followed by a method name. After a C<forward>, the control flow will
1048return to the method from which the C<forward> was issued.
1049
1050A C<forward> is similar to a method call. The main differences are that
1051it wraps the call in an C<eval> to allow exception handling; it
1052automatically passes along the context object (C<$c> or C<$context>);
1053and it allows profiling of each call (displayed in the log with
1054debugging enabled).
1055
1056 sub hello : Global {
1057 my ( $self, $c ) = @_;
1058 $c->stash->{message} = 'Hello World!';
1059 $c->forward('check_message'); # $c is automatically included
1060 }
1061
1062 sub check_message : Private {
1063 my ( $self, $c ) = @_;
1064 return unless $c->stash->{message};
1065 $c->forward('show_message');
1066 }
1067
1068 sub show_message : Private {
1069 my ( $self, $c ) = @_;
1070 $c->res->body( $c->stash->{message} );
1071 }
1072
1073A C<forward> does not create a new request, so your request object
1074(C<$c-E<gt>req>) will remain unchanged. This is a key difference between
1075using C<forward> and issuing a redirect.
1076
1077You can pass new arguments to a C<forward> by adding them
1078in an anonymous array. In this case C<$c-E<gt>req-E<gt>args>
1079will be changed for the duration of the C<forward> only; upon
1080return, the original value of C<$c-E<gt>req-E<gt>args> will
1081be reset.
1082
1083 sub hello : Global {
1084 my ( $self, $c ) = @_;
1085 $c->stash->{message} = 'Hello World!';
1086 $c->forward('check_message',[qw/test1/]);
1087 # now $c->req->args is back to what it was before
1088 }
1089
1090 sub check_message : Private {
1091 my ( $self, $c ) = @_;
1092 my $first_argument = $c->req->args->[0]; # now = 'test1'
1093 # do something...
1094 }
1095
1096As you can see from these examples, you can just use the method name as
1097long as you are referring to methods in the same controller. If you want
1098to forward to a method in another controller, or the main application,
1099you will have to refer to the method by absolute path.
1100
1101 $c->forward('/my/controller/action');
1102 $c->forward('/default'); # calls default in main application
1103
1104Here are some examples of how to forward to classes and methods.
1105
1106 sub hello : Global {
1107 my ( $self, $c ) = @_;
1108 $c->forward(qw/MyApp::Model::Hello say_hello/);
1109 }
1110
1111 sub bye : Global {
1112 my ( $self, $c ) = @_;
1113 $c->forward('MyApp::Model::Hello'); # no method: will try 'process'
1114 }
1115
1116 package MyApp::Model::Hello;
1117
1118 sub say_hello {
1119 my ( $self, $c ) = @_;
1120 $c->res->body('Hello World!');
1121 }
1122
1123 sub process {
1124 my ( $self, $c ) = @_;
1125 $c->res->body('Goodbye World!');
1126 }
1127
1128Note that C<forward> returns to the calling action and continues
1129processing after the action finishes. If you want all further processing
1130in the calling action to stop, use C<detach> instead, which will execute
1131the C<detach>ed action and not return to the calling sub. In both cases,
1132Catalyst will automatically try to call process() if you omit the
1133method.
1134
1135
1136=head3 Testing
1137
1138Catalyst has a built-in http server for testing or local
1139deployment. (Later, you can easily use a more powerful server, for
1140example Apache/mod_perl or FastCGI, in a production environment.)
1141
1142Start your application on the command line...
1143
1144 script/myapp_server.pl
1145
1146...then visit http://localhost:3000/ in a browser to view the output.
1147
1148You can also do it all from the command line:
1149
1150 script/myapp_test.pl http://localhost/
1151
1152Catalyst has a number of tools for actual regression testing of
1153applications. The helper scripts will automatically generate basic tests
1154that can be extended as you develop your project. To write your own
1155comprehensive test scripts, L<Test::WWW::Mechanize::Catalyst> is an
1156invaluable tool.
1157
1158For more testing ideas, see L<Catalyst::Manual::Tutorial::Testing>.
1159
1160Have fun!
1161
1162=head1 SEE ALSO
1163
1164=over 4
1165
1166=item * L<Catalyst::Manual::About>
1167
1168=item * L<Catalyst::Manual::Tutorial>
1169
1170=item * L<Catalyst>
1171
1172=back
1173
1174=head1 SUPPORT
1175
1176IRC:
1177
1178 Join #catalyst on irc.perl.org.
1179 Join #catalyst-dev on irc.perl.org to help with development.
1180
1181Mailing lists:
1182
392906f2 1183 http://lists.scsys.co.uk/mailman/listinfo/catalyst
1184 http://lists.scsys.co.uk/mailman/listinfo/catalyst-dev
cb93c9d7 1185
1186=head1 AUTHOR
1187
1188Sebastian Riedel, C<sri@oook.de>
1189David Naughton, C<naughton@umn.edu>
1190Marcus Ramberg, C<mramberg@cpan.org>
1191Jesse Sheidlower, C<jester@panix.com>
1192Danijel Milicevic, C<me@danijel.de>
1193Kieren Diment, C<kd@totaldatasolution.com>
1194Yuval Kogman, C<nothingmuch@woobling.org>
1195
1196=head1 COPYRIGHT
1197
1198This program is free software. You can redistribute it and/or modify it
1199under the same terms as Perl itself.