NAME

Catalyst::Manual::Intro - Introduction to Catalyst

DESCRIPTION

This should be enough to get you started.

Quickstart

Everything begins with a small application controller.

# lib/MyApp.pm
package MyApp;

use strict;
use Catalyst '-Debug';

__PACKAGE__->config(
    name => 'My Application',
    root => '/home/joeuser/myapp/root'
);

__PACKAGE__->action( '!default' => sub {
    my ( $self, $c ) = @_;
    $c->response->output('Catalyst rockz!');
});

1;

name and root are the only options used by Catalyst itself, name is the name of your application and root is the root directory for additional files like templates.

!default is a built in private action that gets called when no other action matches the requested path. Private actions (prefixed by !) are normally not addressable from the outside world, but !default is an exception from this rule.

This should be enough to get you started.

Testing

Catalyst has a built in http server for testing! (You can later easily use mod_perl in a production environment)

perl -I/home/joeuser/myapp/lib -MCatalyst::Test=MyApp -e1 3000

You can also test you application directly from the command line.

perl -I/home/joeuser/myapp/lib -MCatalyst::Test=MyApp -e1 http://localhost/

Components

The application controller is everything you need for a simple Catalyst application, but that would very soon result in a ball of mud, and thats why we have components (Model/View/Controller).

Catalyst will automatically search for components in lib/MyApp/Model, lib/MyApp/View and lib/MyApp/Controller.

You normally start a component by inheriting everything from a blueprint, like Catalyst::Model::CDBI or Catalyst::View::TT.

# lib/MyApp/View/TT.pm
package MyApp::View::TT;

use strict;
use base 'Catalyst::View::TT';

1;

Thats all, you can now use $c->forward('MyApp::View::TT') from your actions.

Components without a blueprint should inherit everything they need from Catalyst::Base.

Add the component to the process chain.

# lib/MyApp.pm
package MyApp;

use strict;
use Catalyst '-Debug';

__PACKAGE__->config(
    name => 'My Application',
    root => '/home/joeuser/myapp/root'
);

__PACKAGE__->action(
    '!default' => sub {
        my ( $self, $c ) = @_;
        $c->stash->{template} = 'index.tt';
    },
    '!end' => sub {
        my ( $self, $c ) = @_;
        $c->forward('MyApp::View::TT') unless $c->response->output;
    }
);

1;

!end is another built in private action that gets called at the end of a request. (!begin is the opposite of !end...suprise...) So it's mostly used for the View components, to process templates and stuff.

In the example you forwarded processing to MyApp::View::TT, which will render the template defined in $c->stash->{template} to $c->response->output.

Note that if you forward to a class, Catalyst will automatically call the process() method of that class, which MyApp::View::TT inherited from Catalyst::View::TT.

The stash is a universal hash that you should use to store and pass around all kind of data during the requests lifetime.

And don't forget the template or you'll get the chance to look at our eyecandy debug screen. ;)

[%# root/index.tt #%]
Hello Catalyst!

A CDBI Model class is equally simple, first create a database.

-- myapp.sql
CREATE TABLE foo (
    id INTEGER PRIMARY KEY,
    data TEXT
);

CREATE TABLE bar (
    id INTEGER PRIMARY KEY,
    foo INTEGER REFERENCES foo,
    data TEXT
);

INSERT INTO foo (data) VALUES ('TEST!');


% sqlite /tmp/myapp.db < myapp.sql

Then create a CDBI component.

# lib/MyApp/Model/CDBI.pm
package MyApp::Model::CDBI;

use strict;
use base 'Catalyst::Model::CDBI';

__PACKAGE__->config(
    dsn           => 'dbi:SQLite:/tmp/myapp.db',
    relationships => 1
);

1;

Thats all, table layouts and relationships are automatically loaded for you. Use $c->stash to pass data to your templates.

# lib/MyApp.pm
package MyApp;

use strict;
use Catalyst '-Debug';

__PACKAGE__->config(
    name => 'My Application',
    root => '/home/joeuser/myapp/root'
);

__PACKAGE__->action(
    '!end' => sub {
        my ( $self, $c ) = @_;
        $c->stash->{template} ||= 'index.tt';
        $c->forward('MyApp::View::TT') unless $c->response->output;
    },
    'view' => sub {
        my ( $self, $c, $id ) = @_;
        $c->stash->{item} = MyApp::Model::CDBI::Foo->retrieve($id);
    }
);

1;

[%# root/index.tt #%]
The id is [% item.data %]

Have fun!

AUTHOR

Sebastian Riedel, sri@oook.de

COPYRIGHT

This program is free software, you can redistribute it and/or modify it under the same terms as Perl itself.