lets use config::General
[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;
563 use Catalyst qw/-Debug/; # Add other plugins here, e.g.
564 # for session support
565
566 MyApp->config(
567 name => 'My Application',
568
569 # You can put anything else you want in here:
570 my_configuration_variable => 'something',
571 );
572 1;
573
574In older versions of Catalyst, the application class was where you put
575global actions. However, as of version 5.66, the recommended practice is
576to place such actions in a special Root controller (see L</Actions>,
577below), to avoid namespace collisions.
578
579=over 4
580
581=item * B<name>
582
583The name of your application.
584
585=back
586
587Optionally, you can specify a B<root> parameter for templates and static
588data. If omitted, Catalyst will try to auto-detect the directory's
589location. You can define as many parameters as you want for plugins or
590whatever you need. You can access them anywhere in your application via
591C<$context-E<gt>config-E<gt>{$param_name}>.
592
593=head3 Context
594
595Catalyst automatically blesses a Context object into your application
596class and makes it available everywhere in your application. Use the
597Context to directly interact with Catalyst and glue your L</Components>
598together. For example, if you need to use the Context from within a
599Template Toolkit template, it's already there:
600
601 <h1>Welcome to [% c.config.name %]!</h1>
602
603As illustrated in our URL-to-Action dispatching example, the Context is
604always the second method parameter, behind the Component object
605reference or class name itself. Previously we called it C<$context> for
606clarity, but most Catalyst developers just call it C<$c>:
607
608 sub hello : Global {
609 my ( $self, $c ) = @_;
610 $c->res->body('Hello World!');
611 }
612
613The Context contains several important objects:
614
615=over 4
616
617=item * L<Catalyst::Request>
618
619 $c->request
620 $c->req # alias
621
622The request object contains all kinds of request-specific information, like
623query parameters, cookies, uploads, headers, and more.
624
625 $c->req->params->{foo};
626 $c->req->cookies->{sessionid};
627 $c->req->headers->content_type;
628 $c->req->base;
629 $c->req->uri_with( { page = $pager->next_page } );
630
631=item * L<Catalyst::Response>
632
633 $c->response
634 $c->res # alias
635
636The response is like the request, but contains just response-specific
637information.
638
639 $c->res->body('Hello World');
640 $c->res->status(404);
641 $c->res->redirect('http://oook.de');
642
643=item * L<Catalyst::Config>
644
645 $c->config
646 $c->config->{root};
647 $c->config->{name};
648
649=item * L<Catalyst::Log>
650
651 $c->log
652 $c->log->debug('Something happened');
653 $c->log->info('Something you should know');
654
655=item * B<Stash>
656
657 $c->stash
658 $c->stash->{foo} = 'bar';
659 $c->stash->{baz} = {baz => 'qox'};
660 $c->stash->{fred} = [qw/wilma pebbles/];
661
662and so on.
663
664=back
665
666The last of these, the stash, is a universal hash for sharing data among
667application components. For an example, we return to our 'hello' action:
668
669 sub hello : Global {
670 my ( $self, $c ) = @_;
671 $c->stash->{message} = 'Hello World!';
672 $c->forward('show_message');
673 }
674
675 sub show_message : Private {
676 my ( $self, $c ) = @_;
677 $c->res->body( $c->stash->{message} );
678 }
679
680Note that the stash should be used only for passing data in an
681individual request cycle; it gets cleared at a new request. If you need
682to maintain persistent data, use a session. See
683L<Catalyst::Plugin::Session> for a comprehensive set of
684Catalyst-friendly session-handling tools.
685
686=head3 Actions
687
688A Catalyst controller is defined by its actions. An action is a
689subroutine with a special attribute. You've already seen some examples
690of actions in this document. The URL (for example
691http://localhost.3000/foo/bar) consists of two parts, the base
692(http://localhost:3000/ in this example) and the path (foo/bar). Please
693note that the trailing slash after the hostname[:port] always belongs to
694base and not to the action.
695
696=over 4
697
698=item * B<Application Wide Actions>
699
700Actions which are called at the root level of the application
701(e.g. http://localhost:3000/ ) go in MyApp::Controller::Root, like
702this:
703
704 package MyApp::Controller::Root;
705 use base 'Catalyst::Controller';
706 # Sets the actions in this controller to be registered with no prefix
707 # so they function identically to actions created in MyApp.pm
708 __PACKAGE__->config->{namespace} = '';
4299d9f5 709 sub default : Path {
cb93c9d7 710 my ( $self, $context ) = @_;
4299d9f5 711 $context->response->status(404);
712 $context->response->body('404 not found');
cb93c9d7 713 }
714 1;
715
716=back
717
718=head4 Action types
719
720Catalyst supports several types of actions:
721
722=over 4
723
724=item * B<Literal> (B<Path> actions)
725
726 package MyApp::Controller::My::Controller;
727 sub bar : Path('foo/bar') { }
728
729Literal C<Path> actions will act relative to their current
730namespace. The above example matches only
731http://localhost:3000/my/controller/foo/bar. If you start your path with
732a forward slash, it will match from the root. Example:
733
734 package MyApp::Controller::My::Controller;
735 sub bar : Path('/foo/bar') { }
736
737Matches only http://localhost:3000/foo/bar.
738
739 package MyApp::Controller::My::Controller;
740 sub bar : Path { }
741
742By leaving the C<Path> definition empty, it will match on the namespace
743root. The above code matches http://localhost:3000/my/controller.
744
745=item * B<Regex>
746
747 sub bar : Regex('^item(\d+)/order(\d+)$') { }
748
749Matches any URL that matches the pattern in the action key, e.g.
750http://localhost:3000/item23/order42. The '' around the regexp is
751optional, but perltidy likes it. :)
752
753Regex matches act globally, i.e. without reference to the namespace from
754which it is called, so that a C<bar> method in the
755C<MyApp::Controller::Catalog::Order::Process> namespace won't match any
756form of C<bar>, C<Catalog>, C<Order>, or C<Process> unless you
757explicitly put this in the regex. To achieve the above, you should
758consider using a C<LocalRegex> action.
759
760=item * B<LocalRegex>
761
762 sub bar : LocalRegex('^widget(\d+)$') { }
763
764LocalRegex actions act locally. If you were to use C<bar> in
765C<MyApp::Controller::Catalog>, the above example would match urls like
766http://localhost:3000/catalog/widget23.
767
768If you omit the "C<^>" from your regex, then it will match any depth
769from the controller and not immediately off of the controller name. The
770following example differs from the above code in that it will match
771http://localhost:3000/catalog/foo/widget23 as well.
772
773 package MyApp::Controller::Catalog;
774 sub bar : LocalRegex('widget(\d+)$') { }
775
776For both LocalRegex and Regex actions, if you use capturing parentheses
777to extract values within the matching URL, those values are available in
778the C<$c-E<gt>req-E<gt>captures> array. In the above example, "widget23"
779would capture "23" in the above example, and
780C<$c-E<gt>req-E<gt>captures-E<gt>[0]> would be "23". If you want to pass
781arguments at the end of your URL, you must use regex action keys. See
782L</URL Path Handling> below.
783
784=item * B<Top-level> (B<Global>)
785
786 package MyApp::Controller::Foo;
787 sub foo : Global { }
788
789Matches http://localhost:3000/foo. The function name is mapped
790directly to the application base. You can provide an equivalent
791function in this case by doing the following:
792
793 package MyApp::Controller::Root
794 sub foo : Local { }
795
796=item * B<Namespace-Prefixed> (B<Local>)
797
798 package MyApp::Controller::My::Controller;
799 sub foo : Local { }
800
801Matches http://localhost:3000/my/controller/foo.
802
803This action type indicates that the matching URL must be prefixed with a
804modified form of the component's class (package) name. This modified
805class name excludes the parts that have a pre-defined meaning in
806Catalyst ("MyApp::Controller" in the above example), replaces "::" with
807"/", and converts the name to lower case. See L</Components> for a full
808explanation of the pre-defined meaning of Catalyst component class
809names.
810
4299d9f5 811Note that actions with the C< :Local > attribute are equivalent to the
812<:Path('action_name') > so sub foo : Local { } is equivalent to -
813
814 sub foo : Path('foo') { }
815
cb93c9d7 816=item * B<Chained>
817
818Catalyst also provides a method to build and dispatch chains of actions,
819like
820
821 sub catalog : Chained : CaptureArgs(1) {
822 my ( $self, $c, $arg ) = @_;
823 ...
824 }
825
826 sub item : Chained('catalog') : Args(1) {
827 my ( $self, $c, $arg ) = @_;
828 ...
829 }
830
831to handle a C</catalog/*/item/*> path. For further information about this
832dispatch type, please see L<Catalyst::DispatchType::Chained>.
833
834=item * B<Private>
835
836 sub foo : Private { }
837
838Matches no URL, and cannot be executed by requesting a URL that
09f13e1d 839corresponds to the action key. Catalyst's :Private attribute is
840exclusive and doesn't work with other attributes (so will not work
841combined with Path or Chained attributes). With the exception of the
842C< index >, C< auto > and C< default > actions, Private actions can
843only be executed from inside a Catalyst application, by calling the
844C<forward> or C<detach> methods:
cb93c9d7 845
846 $c->forward('foo');
09f13e1d 847 # or
848 $c->detach('foo');
cb93c9d7 849
850See L</Flow Control> for a full explanation of C<forward>. Note that, as
851discussed there, when forwarding from another component, you must use
852the absolute path to the method, so that a private C<bar> method in your
853C<MyApp::Controller::Catalog::Order::Process> controller must, if called
854from elsewhere, be reached with
855C<$c-E<gt>forward('/catalog/order/process/bar')>.
856
857=item * B<Args>
858
859Args is not an action type per se, but an action modifier - it adds a
860match restriction to any action it's provided to, requiring only as many
861path parts as are specified for the action to be valid - for example in
862MyApp::Controller::Foo,
863
864 sub bar :Local
865
866would match any URL starting /foo/bar/. To restrict this you can do
867
868 sub bar :Local :Args(1)
869
870to only match /foo/bar/*/
871
872=back
873
874B<Note:> After seeing these examples, you probably wonder what the point
875is of defining names for regex and path actions. Every public action is
876also a private one, so you have one unified way of addressing components
877in your C<forward>s.
878
879=head4 Built-in Private Actions
880
881In response to specific application states, Catalyst will automatically
882call these built-in private actions in your application class:
883
884=over 4
885
4299d9f5 886=item * B<default : Path>
cb93c9d7 887
888Called when no other action matches. Could be used, for example, for
889displaying a generic frontpage for the main app, or an error page for
955bdf3d 890individual controllers. B<Note>: in older Catalyst applications you
891will see C<default : Private> which is roughly speaking equivalent.
cb93c9d7 892
cb93c9d7 893
4299d9f5 894=item * B<index : Path : Args (0) >
cb93c9d7 895
4299d9f5 896C<index> is much like C<default> except that it takes no arguments and
897it is weighted slightly higher in the matching process. It is useful
898as a static entry point to a controller, e.g. to have a static welcome
899page. Note that it's also weighted higher than Path. Actually the sub
900name C<index> can be called anything you want. The sub attributes are
955bdf3d 901what determines the behaviour of the action. B<Note>: in older
902Catalyst applications, you will see C<index : Private> used, which is
903roughly speaking equivalent.
cb93c9d7 904
905=item * B<begin : Private>
906
907Called at the beginning of a request, before any matching actions are
908called.
909
910=item * B<end : Private>
911
912Called at the end of a request, after all matching actions are called.
913
914=back
915
916=head4 Built-in actions in controllers/autochaining
917
918 Package MyApp::Controller::Foo;
919 sub begin : Private { }
4299d9f5 920 sub default : Path { }
cb93c9d7 921 sub auto : Private { }
922
923You can define built-in private actions within your controllers as
924well. The actions will override the ones in less-specific controllers,
925or your application class. In other words, for each of the three
926built-in private actions, only one will be run in any request
927cycle. Thus, if C<MyApp::Controller::Catalog::begin> exists, it will be
928run in place of C<MyApp::begin> if you're in the C<catalog> namespace,
929and C<MyApp::Controller::Catalog::Order::begin> would override this in
930turn.
931
932=over 4
933
934=item * B<auto : Private>
935
936In addition to the normal built-in actions, you have a special action
937for making chains, C<auto>. Such C<auto> actions will be run after any
938C<begin>, but before your action is processed. Unlike the other
939built-ins, C<auto> actions I<do not> override each other; they will be
940called in turn, starting with the application class and going through to
941the I<most> specific class. I<This is the reverse of the order in which
942the normal built-ins override each other>.
943
944=back
945
946Here are some examples of the order in which the various built-ins
947would be called:
948
949=over 4
950
951=item for a request for C</foo/foo>
952
953 MyApp::begin
954 MyApp::auto
955 MyApp::Controller::Foo::default # in the absence of MyApp::Controller::Foo::Foo
956 MyApp::end
957
958=item for a request for C</foo/bar/foo>
959
960 MyApp::Controller::Foo::Bar::begin
961 MyApp::auto
962 MyApp::Controller::Foo::auto
963 MyApp::Controller::Foo::Bar::auto
964 MyApp::Controller::Foo::Bar::default # for MyApp::Controller::Foo::Bar::foo
965 MyApp::Controller::Foo::Bar::end
966
967=back
968
969The C<auto> action is also distinguished by the fact that you can break
970out of the processing chain by returning 0. If an C<auto> action returns
9710, any remaining actions will be skipped, except for C<end>. So, for the
972request above, if the first auto returns false, the chain would look
973like this:
974
975=over 4
976
977=item for a request for C</foo/bar/foo> where first C<auto> returns
978false
979
980 MyApp::Controller::Foo::Bar::begin
981 MyApp::auto
982 MyApp::Controller::Foo::Bar::end
983
984=back
985
986An example of why one might use this is an authentication action: you
987could set up a C<auto> action to handle authentication in your
988application class (which will always be called first), and if
989authentication fails, returning 0 would skip any remaining methods
990for that URL.
991
992B<Note:> Looking at it another way, C<auto> actions have to return a
993true value to continue processing! You can also C<die> in the auto
994action; in that case, the request will go straight to the finalize
995stage, without processing further actions.
996
997=head4 URL Path Handling
998
999You can pass variable arguments as part of the URL path, separated with
1000forward slashes (/). If the action is a Regex or LocalRegex, the '$' anchor
1001must be used. For example, suppose you want to handle C</foo/$bar/$baz>,
1002where C<$bar> and C<$baz> may vary:
1003
1004 sub foo : Regex('^foo$') { my ($self, $context, $bar, $baz) = @_; }
1005
1006But what if you also defined actions for C</foo/boo> and C</foo/boo/hoo>?
1007
1008 sub boo : Path('foo/boo') { .. }
1009 sub hoo : Path('foo/boo/hoo') { .. }
1010
1011Catalyst matches actions in most specific to least specific order:
1012
1013 /foo/boo/hoo
1014 /foo/boo
1015 /foo # might be /foo/bar/baz but won't be /foo/boo/hoo
1016
1017So Catalyst would never mistakenly dispatch the first two URLs to the
1018'^foo$' action.
1019
1020If a Regex or LocalRegex action doesn't use the '$' anchor, the action will
1021still match a URL containing arguments, however the arguments won't be
1022available via C<@_>.
1023
1024=head4 Parameter Processing
1025
1026Parameters passed in the URL query string are handled with methods in
1027the L<Catalyst::Request> class. The C<param> method is functionally
1028equivalent to the C<param> method of C<CGI.pm> and can be used in
1029modules that require this.
1030
1031 # http://localhost:3000/catalog/view/?category=hardware&page=3
1032 my $category = $c->req->param('category');
1033 my $current_page = $c->req->param('page') || 1;
1034
1035 # multiple values for single parameter name
1036 my @values = $c->req->param('scrolling_list');
1037
1038 # DFV requires a CGI.pm-like input hash
1039 my $results = Data::FormValidator->check($c->req->params, \%dfv_profile);
1040
1041=head3 Flow Control
1042
1043You control the application flow with the C<forward> method, which
1044accepts the key of an action to execute. This can be an action in the
1045same or another Catalyst controller, or a Class name, optionally
1046followed by a method name. After a C<forward>, the control flow will
1047return to the method from which the C<forward> was issued.
1048
1049A C<forward> is similar to a method call. The main differences are that
1050it wraps the call in an C<eval> to allow exception handling; it
1051automatically passes along the context object (C<$c> or C<$context>);
1052and it allows profiling of each call (displayed in the log with
1053debugging enabled).
1054
1055 sub hello : Global {
1056 my ( $self, $c ) = @_;
1057 $c->stash->{message} = 'Hello World!';
1058 $c->forward('check_message'); # $c is automatically included
1059 }
1060
1061 sub check_message : Private {
1062 my ( $self, $c ) = @_;
1063 return unless $c->stash->{message};
1064 $c->forward('show_message');
1065 }
1066
1067 sub show_message : Private {
1068 my ( $self, $c ) = @_;
1069 $c->res->body( $c->stash->{message} );
1070 }
1071
1072A C<forward> does not create a new request, so your request object
1073(C<$c-E<gt>req>) will remain unchanged. This is a key difference between
1074using C<forward> and issuing a redirect.
1075
1076You can pass new arguments to a C<forward> by adding them
1077in an anonymous array. In this case C<$c-E<gt>req-E<gt>args>
1078will be changed for the duration of the C<forward> only; upon
1079return, the original value of C<$c-E<gt>req-E<gt>args> will
1080be reset.
1081
1082 sub hello : Global {
1083 my ( $self, $c ) = @_;
1084 $c->stash->{message} = 'Hello World!';
1085 $c->forward('check_message',[qw/test1/]);
1086 # now $c->req->args is back to what it was before
1087 }
1088
1089 sub check_message : Private {
1090 my ( $self, $c ) = @_;
1091 my $first_argument = $c->req->args->[0]; # now = 'test1'
1092 # do something...
1093 }
1094
1095As you can see from these examples, you can just use the method name as
1096long as you are referring to methods in the same controller. If you want
1097to forward to a method in another controller, or the main application,
1098you will have to refer to the method by absolute path.
1099
1100 $c->forward('/my/controller/action');
1101 $c->forward('/default'); # calls default in main application
1102
1103Here are some examples of how to forward to classes and methods.
1104
1105 sub hello : Global {
1106 my ( $self, $c ) = @_;
1107 $c->forward(qw/MyApp::Model::Hello say_hello/);
1108 }
1109
1110 sub bye : Global {
1111 my ( $self, $c ) = @_;
1112 $c->forward('MyApp::Model::Hello'); # no method: will try 'process'
1113 }
1114
1115 package MyApp::Model::Hello;
1116
1117 sub say_hello {
1118 my ( $self, $c ) = @_;
1119 $c->res->body('Hello World!');
1120 }
1121
1122 sub process {
1123 my ( $self, $c ) = @_;
1124 $c->res->body('Goodbye World!');
1125 }
1126
1127Note that C<forward> returns to the calling action and continues
1128processing after the action finishes. If you want all further processing
1129in the calling action to stop, use C<detach> instead, which will execute
1130the C<detach>ed action and not return to the calling sub. In both cases,
1131Catalyst will automatically try to call process() if you omit the
1132method.
1133
1134
1135=head3 Testing
1136
1137Catalyst has a built-in http server for testing or local
1138deployment. (Later, you can easily use a more powerful server, for
1139example Apache/mod_perl or FastCGI, in a production environment.)
1140
1141Start your application on the command line...
1142
1143 script/myapp_server.pl
1144
1145...then visit http://localhost:3000/ in a browser to view the output.
1146
1147You can also do it all from the command line:
1148
1149 script/myapp_test.pl http://localhost/
1150
1151Catalyst has a number of tools for actual regression testing of
1152applications. The helper scripts will automatically generate basic tests
1153that can be extended as you develop your project. To write your own
1154comprehensive test scripts, L<Test::WWW::Mechanize::Catalyst> is an
1155invaluable tool.
1156
1157For more testing ideas, see L<Catalyst::Manual::Tutorial::Testing>.
1158
1159Have fun!
1160
1161=head1 SEE ALSO
1162
1163=over 4
1164
1165=item * L<Catalyst::Manual::About>
1166
1167=item * L<Catalyst::Manual::Tutorial>
1168
1169=item * L<Catalyst>
1170
1171=back
1172
1173=head1 SUPPORT
1174
1175IRC:
1176
1177 Join #catalyst on irc.perl.org.
1178 Join #catalyst-dev on irc.perl.org to help with development.
1179
1180Mailing lists:
1181
392906f2 1182 http://lists.scsys.co.uk/mailman/listinfo/catalyst
1183 http://lists.scsys.co.uk/mailman/listinfo/catalyst-dev
cb93c9d7 1184
1185=head1 AUTHOR
1186
1187Sebastian Riedel, C<sri@oook.de>
1188David Naughton, C<naughton@umn.edu>
1189Marcus Ramberg, C<mramberg@cpan.org>
1190Jesse Sheidlower, C<jester@panix.com>
1191Danijel Milicevic, C<me@danijel.de>
1192Kieren Diment, C<kd@totaldatasolution.com>
1193Yuval Kogman, C<nothingmuch@woobling.org>
1194
1195=head1 COPYRIGHT
1196
1197This program is free software. You can redistribute it and/or modify it
1198under the same terms as Perl itself.