Additions to Manual::About (describing MVC)
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Manual / About.pod
CommitLineData
aa2b0d97 1=head1 NAME
2
3Catalyst::Manual::About - Basic explanation of Catalyst
4
5=head1 DESCRIPTION
6
7This document is a basic introduction to the I<why> of Catalyst. It does
8not teach you how to write Catalyst applications; for an introduction to
9that please see L<Catalyst::Manual::Intro>. Rather, it explains the
10basics of what Catalyst is typically used for, and why you might want
11to use Catalyst to build your applications.
12
13=head2 What is Catalyst? The short summary
14
15Catalyst is a web application framework. This means that you use it to
16help build applications that run on the web, or that run using protocols
17used for the web. Catalyst is designed to make it easy to manage the
18various tasks you need to do to run an application on the web, either by
19doing them itself, or by letting you "plug in" existing Perl modules
20that do what you need. There are a number of things you typically do
21with a web application, for example:
22
23=over 4
24
25=item * Interact with a web server
26
27If you're on the web, you're relying on a web server, a program that
28sends files over the web. There are a number of these, and your
29application has to do the right thing to make sure that your data works
30with the web server you're using. If you change your web server, you
31don't want to have to rewrite your entire application to work with the
32new one.
33
34=item * Do something based on a URI
35
95bb1e81 36So that C<http://www.mysite.com/catalog/display/23> will go to a
37"display" of item 23 in your catalog, and
38C<http://www.mysite.com/order_status/7582> will display the status of
39order 7582, and C<http://www.mysite.com/add_comment/?page=8> will
40display a form to add a comment to page 8.
aa2b0d97 41
42=item * Interact with a data store
43
44You probably use a database to keep track of your information. Your
45application needs an easy way to interact with your database, so you can
46create, edit, and retrieve your data.
47
48=item * Handle forms
49
50When a user submits a form, you process it, and make sure it's been
51filled in properly, and then then do something based on the
52result--submitting an order, updating a record, sending e-mail, or going
53back to the form if there's an error.
54
55=item * Display results
56
57You have an application running on the web, people need to see
58things. You usually want to display things on a web browser; you will
59probably be using a template system to help generate HTML code; you
60might need other kinds of display, such as PDF files or RSS feeds.
61
62=item * Manage users
63
64You might need the concept of a "user", someone who's allowed to use
65your system, and is allowed to do certain things only. Perhaps normal
66users can only view or modify their own information; administrative
67users can view or modify anything; normal users can only order items for
68their own account; normal users can view things but not modify them;
69order-processing users can send records to a different part of the
70system; and so forth. You need a way of ensuring that people are who
71they say they are, and that people only do the things they're allowed to
72do.
73
74=item * Develop the application itself
75
76When you're writing or modifying the application, you want to have
77access to detailed logs of what it is doing. You want to be able to
78write tests to ensure that it does what it's supposed to, and that new
79changes don't break the existing code.
80
81=back
82
83Catalyst makes it easy to do all of these tasks, and many more. It is
84extremely flexible in terms of what it allows you to do, and very fast.
85It has a very large number of "plugins" that interact with existing Perl
86modules so that you can easily using them from within your application.
87
88=head3 What B<isn't> Catalyst?
89
90Catalyst is not an out-of-the-box solution that allows you to set up a
91complete working e-commerce application in ten minutes. (There are,
92however, several systems built on top of Catalyst that can get you very
93close to a working app.) It is not designed for end users, but for
94working programmers.
95
96=head2 Some background
97
98=head2 The MVC pattern
99
95bb1e81 100MVC, or Model-View-Controller, is a model currently favored for web
101applications. This design pattern is originally from the Smalltalk
102programming language. The basic idea is that the three main areas of an
103application--handling application flow (Controller), processing
104information (Model), and outputting the results (View)--are kept
105separate, so that it is possible to change or replace any one without
106affecting the others.
107
108Discussions of MVC often degenerate into nitpicky arguments about the
109history of the pattern, and exactly what "usually" or "should" go into
110the Controller or the Model. We have no interest in joining such a
111debate. In any case, Catalyst does not enforce any particular setup; you
112are free to put any sort of code in any part of your application, and
113this discussion (and others elsewhere in the Catalyst documentation) is
114only a suggestion based on what we think works well. In most Catalyst
115applications, each branch of MVC will be made of up of several Perl
116modules that can handle different needs in your application.
117
118The purpose of the B<Model> is to access and modify data. Typically
119the Model will interact with a relational database, but it's also
120common to use other data sources, such as the L<Plucene> search
121engine, an LDAP server, etc.
122
123The purpose of the B<View> is to present data to the user. Typical Views
124use a templating module to generate HTML code, using L<Template
125Toolkit|Template>, L<Mason|HTML::Mason>, L<HTML::Template>, or the like,
126but it's also possible to generate PDF output, send email, etc., from a
127View. In Catalyst the View is usually a small module, just gluing some
128other module into Catalyst; the display logic is written within the
129template itself.
130
131The Controller is Catalyst itself. When a request is made to Catalyst,
132it will be received by one of your Controller modules; this module
133will figure out what the user is trying to do, gather the necessary
134data from a Model, and send it to a View for display.
135
136=head3 A simple example
137
138The general idea is that you should be able to change things around
139without affecting the rest of your application. Let's look at a very
140simple example (keeping in mind that there are many ways of doing this,
141and what we're discussing is one possible way, not the only
142way). Suppose you have a record to display. It doesn't matter if it's a
143catalog entry, a library book, a music CD, a personnel record, or
144anything else, but let's pretend it's a catalog entry. A user is given a
145URL such as C<http://www.mysite.com/catalog/display/2782>. Now what?
146
147First, Catalyst figures out that you're using the "catalog" Controller
148(how Catalyst figures this out is entirely up to you; URL dispatching is
149I<extremely> flexible in Catalyst). Then Catalyst sees that you want to
150use a "display" method in your Controller. Somewhere in this process,
151it's possible that you'll have authentication and authorization routines
152to make sure that the user is registered and is allowed to display a
153record. The Controller's display method will then extract "2782" as the
154record you want to retrieve, and make a request to a Model for that
155record. The Controller will then look at what the Model returns: if
156there's no record, the Controller will ask the View to display an error
157message, otherwise it will hand the View the record and ask the View to
158display it. In either case, the View will then generate an HTML page,
159which Catalyst will display to the user's browser, using whatever web
160server you've configured.
161
162How does this help you?
163
164In many ways. Suppose you have a small catalog now, and you're using a
165lightweight database such as SQLite, or even a text file. But eventually
166your site grows, and you need to upgrade to something more
167powerful--MySQL or Postgres, or even Oracle or DB2. If your Model is
168separate, you only have to change one thing, the Model; your Controller
169can expect that if it issues a query to the Model, it will get the right
170kind of result back.
171
172What about the View? The idea is that your template is concerned almost
173entirely with display, so that you can hand it off to a designer who
174doesn't have to worry about how to write code. If you get all the data
175in the Controller and then pass it to the View, the template isn't
176responsible for any kind of data processing. And if you want to change
177your output, it's simple: just write a new View. If your Controller is
178already getting the data you need, you pass it in the same way, and
179whether you display the results to a web browser, generate a PDF, or
180e-mail the results back to the user, the Controller hardly changes at
181all.
182
183And throughout the whole process, most of the tools you need are either
184part of Catalyst (the parameter-processing routines that extract "2782"
185from the URL, for example) or are easily plugged into it (the
186authentication routines, the plugins for using Template Toolkit as your
187View).
188
189Now, Catalyst doesn't enforce very much at all. You can connect to a
190database, issue queries, and act on them from within your View, if you
191want. You can handle paging (i.e. retrieving only a portion of the total
192records possible) in your Controller or your Model. It's up to you. In
193some cases there might be very good reasons to do things a certain way
194(issuing database queries from a template seems to defeat the whole
195purpose of separation-of-concerns, and will drive your designer crazy),
196while in others it's just a matter of personal preference (perhaps your
197template, rather than your Controller, is the better place to decide
198what to display if you get an empty result). Catalyst just gives you the
199tools.
200
aa2b0d97 201=head1 AUTHOR
202
203Jesse Sheidlower, C<jester@panix.com>
204
205=head1 SEE ALSO
206
207L<Catalyst>, L<Catalyst::Manual::Intro>
208
209=head1 COPYRIGHT
210
211This program is free software, you can redistribute it and/or modify it
212under the same terms as Perl itself.