=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
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 ) = @_;