/usr/share/perl5/Catalyst/Manual/About.pod is in libcatalyst-manual-perl 5.9007-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 | =head1 NAME
Catalyst::Manual::About - The philosophy of Catalyst
=head1 DESCRIPTION
This document is a basic introduction to the I<why> of Catalyst. It does
not teach you how to write Catalyst applications; for an introduction to
that please see L<Catalyst::Manual::Intro>. Rather, it explains the
basics of what Catalyst is typically used for, and why you might want
to use Catalyst to build your applications.
=head2 What is Catalyst? The short summary
Catalyst is a web application framework. This means that you use it to
help build applications that run on the web, or that run using protocols
used for the web. Catalyst is designed to make it easy to manage the
various tasks you need to do to run an application on the web, either by
doing them itself, or by letting you "plug in" existing Perl modules
that do what you need. There are a number of things you typically do
with a web application. For example:
=over 4
=item * Interact with a web server
If you're on the web, you're relying on a web server, a program that
sends files over the web. There are a number of these, and your
application has to do the right thing to make sure that your program
works with the web server you're using. If you change your web server,
you don't want to have to rewrite your entire application to work with
the new one.
=item * Do something based on a URI
It's typical for web applications to use URIs as a main way for users to
interact with the rest of the application; various elements of the URI
will indicate what the application needs to do. Thus,
C<http://www.mysite.com/add_record.cgi?name=John&title=President> will
add a person named "John" whose title is "President" to your database,
and C<http://www.mysite.com/catalog/display/23> will go to a "display"
of item 23 in your catalog, and
C<http://www.mysite.com/order_status/7582> will display the status of
order 7582, and C<http://www.mysite.com/add_comment/?page=8> will
display a form to add a comment to page 8. Your application needs to
have a regular way of processing these URIs so it knows what to do
when such a request comes in.
=item * Interact with a data store
You probably use a database to keep track of your information. Your
application needs to interact with your database, so you can create,
edit, and retrieve your data.
=item * Handle forms
When a user submits a form, you receive it, process it to make sure it's
been filled in properly, and then do something based on the
result--submit an order, update a record, send e-mail, or return to the
form if there's an error.
=item * Display results
If you have an application running on the web, people need to see
things. You usually want your application displayed on a web browser, in
which case you will probably be using a template system to help generate
HTML code. But you might need other kinds of display, such as PDF files,
or other forms of output, such as RSS feeds or e-mail.
=item * Manage users
You might need the concept of a "user", someone who's allowed to use
your system, and is allowed to do certain things only. Perhaps normal
users can only view or modify their own information; administrative
users can view or modify anything; normal users can only order items for
their own account; normal users can view things but not modify them;
order-processing users can send records to a different part of the
system; and so forth. You need a way of ensuring that people are who
they say they are, and that people only do the things they're allowed to
do.
=item * Develop the application itself
When you're writing or modifying the application, you want to have
access to detailed logs of what it is doing. You want to be able to
write tests to ensure that it does what it's supposed to, and that new
changes don't break the existing code.
=back
Catalyst makes it easy to do all of these tasks, and many more. It is
extremely flexible in terms of what it allows you to do, and very fast.
It has a large number of "components" and "plugins" that interact with existing Perl
modules so that you can easily use them from within your
application.
=over 4
=item * Interact with a web server?
Catalyst lets you use a number of different ones, and even comes with a
built-in server for testing or local deployment.
=item * Do something based on a URI?
Catalyst has extremely flexible systems for figuring out what to do
based on a URI.
=item * Interact with a data store?
Catalyst has many plugins for different databases and database
frameworks, and for other non-database storage systems.
=item * Handle forms?
Catalyst has plugins available for several form creation and validation
systems that make it easy for the programmer to manage.
=item * Display results?
Catalyst has plugins available for a number of template modules and
other output packages.
=item * Manage users?
Catalyst has plugins that handle sessions, authentication, and
authorization, in any way you need.
=item * Developing the application?
Catalyst has detailed logging built-in, which you can configure as
necessary, and supports the easy creation of new tests--some of which
are automatically created when you begin writing a new application.
=back
=head3 What B<isn't> Catalyst?
Catalyst is not an out-of-the-box solution that allows you to set up a
complete working e-commerce application in ten minutes. (There are,
however, several systems built on top of Catalyst that can get you very
close to a working app.)
Catalyst is designed for flexibility and power; to an extent, this comes
at the expense of simplicity. Programmers have many options for almost
everything they need to do, which means that any given need can be done
in many ways, and finding the one that's right for you, and learning the
right way to do it, can take time. TIMTOWDI works both ways.
Catalyst is not designed for end users, but for working programmers.
=head2 Web programming: The Olden Days
Perl has long been favored for web applications. There are a wide
variety of ways to use Perl on the web, and things have changed over
time. It's possible to handle everything with very raw Perl code:
print "Content-type: text/html\n\n<center><h1>Hello
World!</h1></center>";
for example, or
my @query_elements = split(/&/, $ENV{'QUERY_STRING'});
foreach my $element (@query_elements) {
my ($name, $value) = split(/=/, $element);
# do something with your parameters, or kill yourself
# in frustration for having to program like this
}
Much better than this is to use Lincoln Stein's great L<CGI> module,
which smoothly handles a wide variety of common tasks--parameter
parsing, generating form elements from Perl data structures, printing
http headers, escaping text, and very many more, all with your choice of
functional or object-oriented style. While L<CGI> was revolutionary and
is still widely used, it has various drawbacks that make it unsuitable
for larger applications: it is slow; your code with it generally
combines application logic and display code; and it makes it very
difficult to handle larger applications with complicated control flow.
A variety of frameworks followed, of which the most widely used is
probably L<CGI::Application>, which encourages the development of
modular code, with easy-to-understand control-flow handling, the use of
plugins and templating systems, and the like. Other systems include
L<AxKit>, which is designed for use with XML running under mod_perl;
L<Maypole>--upon which Catalyst was originally based--designed for the
easy development of powerful web databases; L<Jifty>, which does a great
deal of automation in helping to set up web sites with many complex
features; and Ruby on Rails (see L<http://www.rubyonrails.org>), written
of course in Ruby and among the most popular web development systems. It
is not the purpose of this document to criticize or even briefly
evaluate these other frameworks; they may be useful for you and if so we
encourage you to give them a try.
=head2 The MVC pattern
MVC, or Model-View-Controller, is a model currently favored for web
applications. This design pattern is originally from the Smalltalk
programming language. The basic idea is that the three main areas of an
application--handling application flow (Controller), processing
information (Model), and outputting the results (View)--are kept
separate, so that it is possible to change or replace any one without
affecting the others, and so that if you're interested in one particular
aspect, you know where to find it.
Discussions of MVC often degenerate into nitpicky arguments about the
history of the pattern, and exactly what "usually" or "should" go into
the Controller or the Model. We have no interest in joining such a
debate. In any case, Catalyst does not enforce any particular setup; you
are free to put any sort of code in any part of your application, and
this discussion, along with others elsewhere in the Catalyst
documentation, are only suggestions based on what we think works
well. In most Catalyst applications, each branch of MVC will be made of
up of several Perl modules that can handle different needs in your
application.
The purpose of the B<Model> is to access and modify data. Typically the
Model will interact with a relational database, but it's also common to
use other data sources, such as the L<Xapian|Catalyst::Model::Xapian>
search engine or an LDAP server.
The purpose of the B<View> is to present data to the user. Typical Views
use a templating module to generate HTML code, using L<Template
Toolkit|Template>, L<Mason|HTML::Mason>, L<HTML::Template>, or the like,
but it's also possible to generate PDF output, send e-mail, etc., from a
View. In Catalyst applications the View is usually a small module, just
gluing some other module into Catalyst; the display logic is written
within the template itself.
The B<Controller> is Catalyst itself. When a request is made to Catalyst,
it will be received by one of your Controller modules; this module
will figure out what the user is trying to do, gather the necessary
data from a Model, and send it to a View for display.
=head3 A simple example
The general idea is that you should be able to change things around
without affecting the rest of your application. Let's look at a very
simple example (keeping in mind that there are many ways of doing this,
and what we're discussing is one possible way, not the only
way). Suppose you have a record to display. It doesn't matter if it's a
catalog entry, a library book, a music CD, a personnel record, or
anything else, but let's pretend it's a catalog entry. A user is given a
URL such as C<http://www.mysite.com/catalog/display/2782>. Now what?
First, Catalyst figures out that you're using the "catalog" Controller
(how Catalyst figures this out is entirely up to you; URL dispatching is
I<extremely> flexible in Catalyst). Then Catalyst determines that you
want to use a C<display> method in your "catalog" Controller. (There
could be other C<display> methods in other Controllers, too.) Somewhere
in this process, it's possible that you'll have authentication and
authorization routines to make sure that the user is registered and is
allowed to display a record. The Controller's C<display> method will
then extract "2782" as the record you want to retrieve, and make a
request to a Model for that record. The Controller will then look at
what the Model returns: if there's no record, the Controller will ask
the View to display an error message, otherwise it will hand the View
the record and ask the View to display it. In either case, the View will
then generate an HTML page, which Catalyst will send to the user's
browser, using whatever web server you've configured.
=head3 How does this help you?
In many ways. Suppose you have a small catalog now, and you're using a
lightweight database such as SQLite, or maybe just a text file. But
eventually your site grows, and you need to upgrade to something more
powerful--MySQL or Postgres, or even Oracle or DB2. If your Model is
separate, you only have to change one thing, the Model; your Controller
can expect that if it issues a query to the Model, it will get the right
kind of result back.
What about the View? The idea is that your template is concerned almost
entirely with display, so that you can hand it off to a designer who
doesn't have to worry about how to write code. If you get all the data
in the Controller and then pass it to the View, the template isn't
responsible for any kind of data processing. And if you want to change
your output, it's simple: just write a new View. If your Controller is
already getting the data you need, you can pass it in the same way, and
whether you display the results to a web browser, generate a PDF, or
e-mail the results back to the user, the Controller hardly changes at
all--it's up to the View.
And throughout the whole process, most of the tools you need are either
part of Catalyst (the parameter-processing routines that extract "2782"
from the URL, for example) or are easily plugged into it (the
authentication routines, or the plugins for using Template Toolkit as
your View).
Now, Catalyst doesn't enforce very much at all. Template Toolkit is a
very powerful templating system, and you can connect to a database,
issue queries, and act on them from within a TT-based View, if you
want. You can handle paging (i.e. retrieving only a portion of the total
records possible) in your Controller or your Model. In the above
example, your Controller looked at the query result, determining whether
to ask the View for a no-result error message, or for a result display;
but it's perfectly possible to hand your query result directly to the
View, and let your template decide what to do. It's up to you; Catalyst
doesn't enforce anything.
In some cases there might be very good reasons to do things a certain
way (issuing database queries from a template defeats the whole purpose
of separation-of-concerns, and will drive your designer crazy), while in
others it's just a matter of personal preference (perhaps your template,
rather than your Controller, is the better place to decide what to
display if you get an empty result). Catalyst just gives you the tools.
=head1 SEE ALSO
L<Catalyst>, L<Catalyst::Manual::Intro>
=head1 AUTHORS
Catalyst Contributors, see Catalyst.pm
=head1 COPYRIGHT
This library is free software. You can redistribute it and/or modify it under
the same terms as Perl itself.
=cut
|