=head2 Enable debug status in the environment
Normally you enable the debugging info by adding the C<-Debug> flag to
-your C<use Catalyst> statement (or C<__PACKAGE__->setup(qw/-Debug/)
-). However, you can also enable it using environment variable, so you
-can (for example) get debug info without modifying your application
-scripts. Just set C<CATALYST_DEBUG> or C<E<lt>MYAPPE<gt>_DEBUG> to a
-true value.
+your C<use Catalyst> statement . However, you can also enable it using
+environment variable, so you can (for example) get debug info without
+modifying your application scripts. Just set C<CATALYST_DEBUG> or
+C<E<lt>MYAPPE<gt>_DEBUG> to a true value.
=head2 Sessions
=head3 EXAMPLE
use parent qw/Catalyst/;
- __PACKAGE__->setup( qw/
+ use Catalyst qw/
Session
Session::Store::FastMmap
Session::State::Cookie
- /;)
+ /;
## Write data into the session
implementing roles:
use parent qw/Catalyst/;
- __PACKAGE__->setup (qw/
+ use Catalyst qw/
Authentication
Authentication::Credential::Password
Authentication::Store::Htpasswd
- Authorization::Roles
- /);
+ Authorization::Roles/;
Roles are implemented automatically when using
L<Catalyst::Authentication::Store::Htpasswd>:
=head3 EXAMPLE
use parent qw/Catalyst/;
- __PACKAGE__->setup( qw/Authentication
- Authentication::Credential::Password
- Authentication::Store::Htpasswd
- Authorization::Roles/);
+ use Catalyst qw/Authentication
+ Authentication::Credential::Password
+ Authentication::Store::Htpasswd
+ Authorization::Roles/;
__PACKAGE__->config->{authentication}{htpasswd} = "passwdfile";
control checks. Let's load it:
use parent qw/Catalyst/;
- __PACKAGE__->setup(qw/
- Authentication # yadda yadda
- Authorization::Roles
- /);
+ use Catalyst qw/
+ Authentication # yadda yadda
+ Authorization::Roles
+ /;
And now our action should look like this:
3. Add the XMLRPC plugin to MyApp.pm
- __PACKAGE__->setup( qw/-Debug Static::Simple XMLRPC/);
+ use Catalyst qw/-Debug Static::Simple XMLRPC/;
4. Add an API controller
http://localhost:3000/handles
+See also: L<Catalyst::DispatchType::Path>
+
=item Local
When using a Local attribute, no parameters are needed, instead, the
etc.
+See also: L<Catalyst::DispatchType::Regex>
+
=item LocalRegex
A LocalRegex is similar to a Regex, except it only matches below the current
etc.
+=item Chained
+
+See L<Catalyst::DispatchType::Chained> for a description of how the chained
+dispatch type works.
+
=item Private
Last but not least, there is the Private attribute, which allows you
L<http://dev.catalyst.perl.org/wiki/FlowChart>
+=head2 DRY Controllers with Chained actions.
+
+Imagine that you would like the following paths in your application:
+
+=over
+
+=item B</cd/<ID>/track/<ID>>
+
+Displays info on a particular track.
+
+In the case of a multi-volume CD, this is the track sequence.
+
+=item B</cd/<ID>/volume/<ID>/track/<ID>>
+
+Displays info on a track on a specific volume.
+
+=back
+
+Here is some example code, showing how to do this with chained controllers:
+
+ package CD::Controller;
+ use base qw/Catalyst::Controller/;
+
+ sub root : Chained('/') PathPart('/cd') CaptureArgs(1) {
+ my ($self, $c, $cd_id) = @_;
+ $c->stash->{cd_id} = $cd_id;
+ $c->stash->{cd} = $self->model('CD')->find_by_id($cd_id);
+ }
+
+ sub trackinfo : Chained('track') PathPart('') Args(0) RenderView {
+ my ($self, $c) = @_;
+ }
+
+ package CD::Controller::ByTrackSeq;
+ use base qw/CD::Controller/;
+
+ sub track : Chained('root') PathPart('track') CaptureArgs(1) {
+ my ($self, $c, $track_seq) = @_;
+ $c->stash->{track} = $self->stash->{cd}->find_track_by_seq($track_seq);
+ }
+
+ package CD::Controller::ByTrackVolNo;
+ use base qw/CD::Controller/;
+
+ sub volume : Chained('root') PathPart('volume') CaptureArgs(1) {
+ my ($self, $c, $volume) = @_;
+ $c->stash->{volume} = $volume;
+ }
+
+ sub track : Chained('volume') PathPart('track') CaptureArgs(1) {
+ my ($self, $c, $track_no) = @_;
+ $c->stash->{track} = $self->stash->{cd}->find_track_by_vol_and_track_no(
+ $c->stash->{volume}, $track_no
+ );
+ }
+
+Note that adding other actions (i.e. chain endpoints) which operate on a track
+is simply a matter of adding a new sub to CD::Controller - no code is duplicated,
+even though there are two different methods of looking up a track.
+
+This technique can be expanded as needed to fulfil your requirements - for example,
+if you inherit the first action of a chain from a base class, then mixing in a
+different base class can be used to duplicate an entire URL hieratchy at a different
+point within your application.
+
=head2 Component-based Subrequests
See L<Catalyst::Plugin::SubRequest>.
(See the L<Catalyst::Manual::Intro> Flow_Control section for more
information on passing arguments via C<forward>.)
+=head2 Chained dispatch using base classes, and inner packages.
+
+ package MyApp::Controller::Base;
+ use base qw/Catalyst::Controller/;
+
+ sub key1 : Chained('/')
=head1 Deployment
=head3 Cons
+You may have to disable mod_deflate. If you experience page hangs with
+mod_fastcgi then remove deflate.load and deflate.conf from mods-enabled/
+
=head4 More complex environment
With FastCGI, there are more things to monitor and more processes running
Using the plugin is as simple as setting your use line in MyApp.pm to include:
- __PACKAGE__->setup( qw/Static::Simple/);
+ use Catalyst qw/Static::Simple/;
and already files will be served.
In your main application class (MyApp.pm), load the plugin:
- __PACKAGE__->setup( qw/-Debug FormValidator Static OtherPlugin/);
+ use Catalyst qw/-Debug FormValidator Static OtherPlugin/;
You will also need to make sure your end method does I<not> forward
static content to the view, perhaps like this:
application for a cache because the source document changes
infrequently but may be viewed many times.
- __PACKAGE__->setup( qw/Cache::FileCache/);
+ use Catalyst qw/Cache::FileCache/;
...
We can add the PageCache plugin to speed things up.
- __PACKAGE__->setup( qw/Cache::FileCache PageCache/);
+ use Catalyst qw/Cache::FileCache PageCache/;
sub front_page : Path ('/') {
my ( $self, $c ) = @_;