Fixed: Path() in Intro.pod
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Manual / Intro.pod
1 =head1 NAME
2
3 Catalyst::Manual::Intro - Introduction to Catalyst
4
5 =head1 DESCRIPTION
6
7 This is a brief overview of why and how to use Catalyst. It explains how Catalyst works and shows how to get a simple application up and running quickly.
8
9 =head2 What is Catalyst?
10
11 Catalyst is an elegant web application framework, extremely flexible yet extremely simple. It's similar to Ruby on Rails, Spring (Java) and L<Maypole>, upon which it was originally based.
12
13 =head3 MVC
14
15 Catalyst follows the Model-View-Controller (MVC) design pattern, allowing you to easily separate concerns, like content, presentation, and flow control, into separate modules. This separation allows you to modify code that handles one concern without affecting code that handles the others. Catalyst promotes the re-use of existing Perl modules that already handle common web application concerns well.
16
17 Here's how the M, V, and C map to those concerns, with examples of well-known Perl modules you may want to use for each.
18
19 =over 4
20
21 =item * B<Model>
22
23 Access and modify content (data). L<Class::DBI>, L<Plucene>, L<Net::LDAP>...
24
25 =item * B<View>
26
27 Present content to the user. L<Template Toolkit|Template>, L<Mason|HTML::Mason>, L<HTML::Template>...
28
29 =item * B<Controller>
30
31 Control the whole request phase, check parameters, dispatch actions, flow control. Catalyst!
32
33 =back
34
35 If you're unfamiliar with MVC and design patterns, you may want to check out the original book on the subject, I<Design Patterns>, by Gamma, Helm, Johson and Vlissides, also known as the Gang of Four (GoF). You can also just google it. Many, many web application frameworks are based on MVC, including all those listed above.
36
37 =head3 Flexibility
38
39 Catalyst is much more flexible than many other frameworks. We'll talk more about this later, but rest assured you can use your favorite Perl modules with Catalyst.
40
41 =over 4
42
43 =item * B<Multiple Models, Views, and Controllers>
44
45 To build a Catalyst application, you handle each type of concern inside special modules called L</Components>. Often this code will be very simple, just calling out to Perl modules like those listed above under L</MVC>. Catalyst handles these components in a very flexible way. Use as many Models, Views, and Controllers as you like, using as many different Perl modules as you like, all in the same application. Want to manipulate multiple databases, and retrieve some data via LDAP? No problem. Want to present data from the same Model using L<Template Toolkit|Template> and L<PDF::Template>? Easy.
46
47 =item * B<Reuseable Components>
48
49 Not only does Catalyst promote the re-use of already existing Perl modules, it also allows you to re-use your Catalyst components in multiple Catalyst applications. 
50
51 =item * B<Unrestrained URL-to-Action Dispatching>
52
53 Catalyst allows you to dispatch any URLs to any application L<Actions>, even through regular expressions! Unlike most other frameworks, it doesn't require mod_rewrite or class and method names in URLs.
54
55 With Catalyst you register your actions and address them directly. For example:
56
57     sub hello : Global {
58         my ( $self, $context ) = @_;
59         $context->response->output('Hello World!');
60     }
61
62 Now http://localhost:3000/hello prints "Hello World!".
63
64 =item * B<Support for CGI, mod_perl, Apache::Request>
65
66 Use L<Catalyst::Engine::Apache> or L<Catalyst::Engine::CGI>.
67
68 =back
69
70 =head3 Simplicity
71
72 The best part is that Catalyst implements all this flexibility in a very simple way.
73
74 =over 4
75
76 =item * B<Building Block Interface>
77
78 Components interoperate very smoothly. For example, Catalyst automatically makes a L<Context> object available to every component. Via the context, you can access the request object, share data between components, and control the flow of your application. Building a Catalyst application feels a lot like snapping together toy building blocks, and everything just works.
79
80 =item * B<Component Auto-Discovery>
81
82 No need to C<use> all of your components. Catalyst automatically finds and loads them.
83
84 =item * B<Pre-Built Components for Popular Modules>
85
86 See L<Catalyst::Model::CDBI> for L<Class::DBI>, or L<Catalyst::View::TT> for L<Template Toolkit|Template>. You can even get an instant web database front end with L<Catalyst::Model::CDBI::CRUD>.
87
88 =item * B<Built-in Test Framework>
89
90 Catalyst comes with a built-in, lightweight http server and test framework, making it easy to test applications from the command line.
91
92 =item * B<Helper Scripts>
93
94 Catalyst provides helper scripts to quickly generate running starter code for components and unit tests.
95
96 =back
97
98 =head2 Quickstart
99
100 Here's how to install Catalyst and get a simple application up and running, using the helper scripts described above.
101
102 =head3 Install
103
104     $ perl -MCPAN -e 'install Bundle::Catalyst'
105
106 =head3 Setup
107
108     $ catalyst.pl MyApp
109     # output omitted
110     $ cd MyApp
111     $ script/myapp_create.pl controller Library::Login
112
113 =head3 Run
114
115     $ script/myapp_server.pl
116
117 Now visit these locations with your favorite browser or user agent to see Catalyst in action:
118
119 =over 4
120
121 =item http://localhost:3000/
122
123 =item http://localhost:3000/library/login/
124
125 =back
126
127 Dead easy!
128
129 =head2 How It Works
130
131 Let's see how Catalyst works, by taking a closer look at the components and other parts of a Catalyst application.
132
133 =head3 Application Class
134
135 In addition to the Model, View, and Controller components, there's a single class that represents your application itself. This is where you configure your application, load plugins, define application-wide actions, and extend Catalyst.
136
137     package MyApp;
138
139     use strict;
140     use Catalyst qw/-Debug/;
141
142     MyApp->config(
143         name => 'My Application',
144         root => '/home/joeuser/myapp/root',
145
146         # You can put anything else you want in here:
147         my_configuration_variable => 'something',
148     );
149
150     sub default : Private {
151         my ( $self, $context ) = @_;
152         $context->response->output('Catalyst rockz!');
153     }
154
155     1;
156
157 For most applications, Catalyst requires you to define only two config parameters:
158
159 =over 4
160
161 =item * B<name>
162
163 Name of your application.
164
165 =item * B<root>
166
167 Path to additional files such as templates, images, or other static data.
168
169 =back
170
171 However, you can define as many parameters as you want for plugins or whatever you need. You can access them anywhere in your application via C<$context-E<gt>config-E<gt>{$param_name}>.
172
173 =head3 Context
174
175 Catalyst automatically blesses a Context object into your application class and makes it available everywhere in your application. Use the Context to directly interact with Catalyst and glue your L<Components> together. For example, if you need to use the Context from within a Template Toolkit template, it's already there:
176
177     <h1>Welcome to [% c.config.name %]!</h1>
178
179 As illustrated earlier in our URL-to-Action dispatching example, the Context is always the second method parameter, behind the Component object reference or class name itself. Previously we called it C<$context> for clarity, but most Catalyst developers just call it C<$c>:
180
181     sub hello : Global {
182         my ( $self, $c ) = @_;
183         $c->res->output('Hello World!');
184     }
185
186 The Context contains several important objects:
187
188 =over 4
189
190 =item * L<Catalyst::Request>
191
192     $c->request
193     $c->req # alias
194
195 The request object contains all kinds of request-specific information, like query parameters, cookies, uploads, headers, and more.
196
197     $c->req->params->{foo};
198     $c->req->cookies->{sessionid};
199     $c->req->headers->content_type;
200     $c->req->base;
201
202 =item * L<Catalyst::Response>
203
204     $c->response
205     $c->res # alias
206
207 The response is like the request, but contains just response-specific information.
208
209     $c->res->output('Hello World');
210     $c->res->status(404);
211     $c->res->redirect('http://oook.de');
212
213 =item * L<Catalyst::Config>
214
215     $c->config
216
217     $c->config->root;
218     $c->config->name;
219
220 =item * L<Catalyst::Log>
221
222     $c->log
223
224     $c->log->debug('Something happened');
225     $c->log->info('Something you should know');
226
227 =item * B<Stash>
228
229     $c->stash
230
231     $c->stash->{foo} = 'bar';
232
233 =back
234
235 The last of these, the stash, is a universal hash for sharing data among application components. For an example, we return to our 'hello' action:
236
237     sub hello : Global {
238         my ( $self, $c ) = @_;
239         $c->stash->{message} = 'Hello World!';
240         $c->forward('show_message');
241     }
242
243     sub show_message : Private {
244         my ( $self, $c ) = @_;
245         $c->res->output( $c->stash->{message} );
246     }
247
248 Note that the stash should be used only for passing data in an individual request cycle; it gets cleared at a new request. If you need to maintain more persistent data, use a session.
249
250 =head3 Actions
251
252 A Catalyst controller is defined by its actions. An action is a sub with
253 a special attribute. You've already seen some examples of actions in
254 this document.
255
256 Catalyst supports several types of actions:
257
258 =over 4
259
260 =item * B<Literal>
261
262     sub bar : Path('foo/bar') { }
263
264 Matches only http://localhost:3000/foo/bar.
265
266 =item * B<Regex>
267
268     sub bar : Regex('^item(\d+)/order(\d+)$') { }
269
270 Matches any URL that matches the pattern in the action key, e.g. http://localhost:3000/item23/order42. The '' around the regexp is optional, but perltidy likes it. :)
271
272 Regex matches act globally, i.e. without reference to the namespace from which it is called, so that a C<bar> method in the C<MyApp::Controller::Catalog::Order::Process> namespace won't match any form of C<bar>, C<Catalog>, C<Order>, or C<Process> unless you explicitly put this in the regex.
273
274 If you use capturing parentheses to extract values within the matching URL (23, 42 in the above example), those values are available in the $c->req->snippets array. If you want to pass arguments at the end of your URL, you must use regex action keys. See L</URL Argument Handling> below.
275
276 =item * B<Top-level>
277
278     package MyApp; 
279     sub foo : Global { }
280
281 Matches http://localhost:3000/foo. The function name is mapped directly
282 to the application base.
283
284 =item * B<Namespace-Prefixed>
285
286     package MyApp::C::My::Controller; 
287     sub foo : Local { }
288
289 Matches http://localhost:3000/my/controller/foo. 
290
291 This action type indicates that the matching URL must be prefixed with a modified form of the component's class (package) name. This modified class name excludes the parts that have a pre-defined meaning in Catalyst ("MyApp::C" in the above example), replaces "::" with "/", and converts the name to lower case. See L</Components> for a full explanation of the pre-defined meaning of Catalyst component class names.
292
293 =item * B<Private>
294
295     sub foo : Private { }
296
297 Matches no URL, and cannot be executed by requesting a URL that corresponds to the action key. Private actions can be executed only inside a Catalyst application, by calling the C<forward> method:
298
299     $c->forward('foo');
300
301 See L</Flow Control> for a full explanation of C<forward>. Note that, as discussed there, when forwarding from another component, you must use the absolute path to the method, so that a private C<bar> method in your C<MyApp::Controller::Catalog::Order::Process> controller must, if called from elsewhere, be reach with C<$c-E<gt>forward('/catalog/order/process/bar')>.
302
303 =back
304
305 B<Note:> After seeing these examples, you probably wonder what the point
306 is of defining names for regex and path actions. Actually, every public
307 action is also a private one, so you have one unified way of addressing
308 components in your C<forward>s.
309
310 =head4 Built-in Private Actions
311
312 In response to specific application states, Catalyst will automatically call these built-in private actions:
313
314 =over 4
315
316 =item * B<default : Private>
317
318 Called when no other action matches.
319
320 =item * B<begin : Private>
321
322 Called at the beginning of a request, before any matching actions are called.
323
324 =item * B<end : Private>
325
326 =back
327
328 Called at the end of a request, after all matching actions are called.
329
330 =head4 B<Built-in actions in controllers/autochaining>
331
332     Package MyApp::C::Foo;
333     sub begin : Private { }
334     sub default : Private { }
335
336 You can define the Built-in Private Actions within your controllers as 
337 well. The actions will override the ones in lower level controllers or
338 your global application.
339
340 In addition to the normal built-ins, you have a special action for 
341 making inheritance chains, 'auto'. These will be run after C<begin>, 
342 but before your action is processed.
343
344 =over 4
345
346 =item for a request for /foo/foo
347
348   MyApp::begin
349   MyApp::auto
350   MyApp::C::Foo::default
351   MyApp::end
352
353 =item for a request for /foo/bar/foo
354
355   MyApp::C::Foo::Bar::begin
356   MyApp::auto
357   MyApp::C::Foo::auto
358   MyApp::C::Foo::Bar::default
359   MyApp::C::Foo::Bar::end
360
361 =back
362
363 Also, if you need to break out of the chain in one of your auto 
364 actions, you can return 0, if so, your action will not be processed,
365 but the end will, so for the request above, if the first auto returns
366 false, it would look like this:
367
368 =over 4
369
370 =item for a request for /foo/bar/foo where auto returns false
371
372   MyApp::C::Foo::Bar::begin
373   MyApp::auto
374   MyApp::C::Foo::Bar::end
375
376 =back
377
378 B<Note:> auto actions have to return a true value to continue
379 processing!  You can also die in the autochain action, in that case, the
380 request will go straight to the finalize stage, without processing
381 further actions.
382
383
384 =head4 B<URL Argument Handling>
385
386 If you want to pass variable arguments at the end of a URL, you must use regex actions keys with '^' and '$' anchors, and the arguments must be separated with forward slashes (/) in the URL. For example, suppose you want to handle /foo/$bar/$baz, where $bar and $baz may vary:
387
388     sub foo : Regex('^foo$') { my ($self, $context, $bar, $baz) = @_; }
389
390 But what if you also defined actions for /foo/boo and /foo/boo/hoo ?
391
392     sub boo : Path('foo/boo') { .. }
393     sub hoo : Path('foo/boo/hoo') { .. }
394
395 Catalyst matches actions in most specific to least specific order:
396
397     /foo/boo/hoo
398     /foo/boo
399     /foo # might be /foo/bar/baz
400
401 So Catalyst would never mistakenly dispatch the first two URLs to the '^foo$' action.
402
403 =head3 Flow Control
404
405 You control the application flow with the C<forward> method, which accepts the key of an action to execute.
406
407     sub hello : Global {
408         my ( $self, $c ) = @_;
409         $c->stash->{message} = 'Hello World!';
410         $c->forward('check_message');
411     }
412
413     sub check_message : Private {
414         my ( $self, $c ) = @_;
415         return unless $c->stash->{message};
416         $c->forward('show_message');
417     }
418
419     sub show_message : Private {
420         my ( $self, $c ) = @_;
421         $c->res->output( $c->stash->{message} );
422     }
423     
424 As you can see from these examples, you can just use the method name as long as you are referring to methods in the same controller. If you want to forward to a method in another controller, or the main application, you will have to refer to the method by absolute path.
425
426   $c->forward('/my/controller/action');
427   $c->forward('/default');
428
429 You can also forward to classes and methods.
430
431     sub hello : Global {
432         my ( $self, $c ) = @_;
433         $c->forward(qw/MyApp::M::Hello say_hello/);
434     }
435
436     sub bye : Global {
437         my ( $self, $c ) = @_;
438         $c->forward('MyApp::M::Hello');
439     }
440
441     package MyApp::M::Hello;
442
443     sub say_hello {
444         my ( $self, $c ) = @_;
445         $c->res->output('Hello World!');
446     }
447
448     sub process {
449         my ( $self, $c ) = @_;
450         $c->res->output('Goodbye World!');
451     }
452
453 Note that C<forward> returns to the calling action and continues processing after the action finishes.
454 Catalyst will automatically try to call process() if you omit the method.
455
456 =head3 Components
457
458 Catalyst has an uncommonly flexible component system. You can define as many L<Models>, L<Views>, and L<Controllers> as you like.
459
460 All components must inherit from L<Catalyst::Base>, which provides a simple class structure and some common class methods like C<config> and C<new> (constructor).
461
462     package MyApp::C::Catalog;
463
464     use strict;
465     use base 'Catalyst::Base';
466
467     __PACKAGE__->config( foo => 'bar' );
468
469     1;
470
471 You don't have to C<use> or otherwise register Models, Views, and Controllers. Catalyst automatically discovers and instantiates them when you call C<setup> in the main application. All you need to do is put them in directories named for each Component type. Notice that you can use some very terse aliases for each one.
472
473 =over 4
474
475 =item * B<MyApp/Model/> 
476
477 =item * B<MyApp/M/>
478
479 =item * B<MyApp/View/>
480
481 =item * B<MyApp/V/>
482
483 =item * B<MyApp/Controller/>
484
485 =item * B<MyApp/C/>
486
487 =back
488
489 =head4 Views
490
491 To show how to define views, we'll use an already-existing base class for the L<Template Toolkit|Template>, L<Catalyst::View::TT>. All we need to do is inherit from this class:
492
493     package MyApp::V::TT;
494
495     use strict;
496     use base 'Catalyst::View::TT';
497
498     1;
499
500 (You can also generate this automatically by using the helper script:
501
502     script/myapp_create.pl view TT TT
503
504 where the first C<TT> tells the script to create a Template Toolkit
505 view, and the second tells the script that its name should be C<TT>.)
506
507 This gives us a process() method and we can now just do $c->forward('MyApp::V::TT') to render our templates. The base class makes process() implicit, so we don't have to say C<$c-E<gt>forward(qw/MyApp::V::TT process/)>.
508
509     sub hello : Global {
510         my ( $self, $c ) = @_;
511         $c->stash->{template} = 'hello.tt';
512     }
513
514     sub end : Private {
515         my ( $self, $c ) = @_;
516         $c->forward('MyApp::V::TT');
517     }
518
519 You normally render templates at the end of a request, so it's a perfect use for the global C<end> action.
520
521 Also, be sure to put the template under the directory specified in C<$c-E<gt>config-E<gt>{root}>, or you'll be forced to look at our eyecandy debug screen. ;)
522
523 =head4 Models
524
525 To show how to define models, again we'll use an already-existing base class, this time for L<Class::DBI>: L<Catalyst::Model::CDBI>.
526
527 But first, we need a database.
528
529     -- myapp.sql
530     CREATE TABLE foo (
531         id INTEGER PRIMARY KEY,
532         data TEXT
533     );
534
535     CREATE TABLE bar (
536         id INTEGER PRIMARY KEY,
537         foo INTEGER REFERENCES foo,
538         data TEXT
539     );
540
541     INSERT INTO foo (data) VALUES ('TEST!');
542
543
544     % sqlite /tmp/myapp.db < myapp.sql
545
546 Now we can create a CDBI component for this database.
547
548     package MyApp::M::CDBI;
549
550     use strict;
551     use base 'Catalyst::Model::CDBI';
552
553     __PACKAGE__->config(
554         dsn           => 'dbi:SQLite:/tmp/myapp.db',
555         relationships => 1
556     );
557
558     1;
559
560 Catalyst automatically loads table layouts and relationships. Use the stash to pass data to your templates.
561
562     package MyApp;
563
564     use strict;
565     use Catalyst '-Debug';
566
567     __PACKAGE__->config(
568         name => 'My Application',
569         root => '/home/joeuser/myapp/root'
570     );
571     
572     __PACKAGE__->setup;
573
574     sub end : Private {
575         my ( $self, $c ) = @_;
576         $c->stash->{template} ||= 'index.tt';
577         $c->forward('MyApp::V::TT');
578     }
579
580     sub view : Global {
581         my ( $self, $c, $id ) = @_;
582         $c->stash->{item} = MyApp::M::CDBI::Foo->retrieve($id);
583     }
584
585     1;
586
587     The id is [% item.data %]
588
589 =head4 Controllers
590
591 Multiple controllers are a good way to separate logical domains of your application.
592
593     package MyApp::C::Login;
594
595     sign-in : Local { }
596     new-password : Local { }
597     sign-out : Local { }
598
599     package MyApp::C::Catalog;
600
601     sub view : Local { }
602     sub list : Local { }
603
604     package MyApp::C::Cart;
605
606     sub add : Local { }
607     sub update : Local { }
608     sub order : Local { }
609
610 =head3 Testing
611
612 Catalyst has a built-in http server for testing! (Later, you can easily use a more powerful server, e.g. Apache/mod_perl, in a production environment.)
613
614 Start your application on the command line...
615
616     script/myapp_server.pl
617
618 ...then visit http://localhost:3000/ in a browser to view the output.
619
620 You can also do it all from the command line:
621
622     script/myapp_test.pl http://localhost/
623
624 Have fun!
625
626 =head1 SUPPORT
627
628 IRC:
629
630     Join #catalyst on irc.perl.org.
631
632 Mailing-lists:
633
634     http://lists.rawmode.org/mailman/listinfo/catalyst
635     http://lists.rawmode.org/mailman/listinfo/catalyst-dev
636
637 =head1 AUTHOR
638
639 Sebastian Riedel, C<sri@oook.de> 
640 David Naughton, C<naughton@umn.edu>
641 Marcus Ramberg, C<mramberg@cpan.org>
642 Jesse Sheidlower, C<jester@panix.com>
643
644 =head1 COPYRIGHT
645
646 This program is free software, you can redistribute it and/or modify it under
647 the same terms as Perl itself.