簡単なアプリケーション

とりあえずモデル使わずに、

  • アプリケーションクラス
  • ベースコントローラ
  • ベースビュー
  • コントローラ2つ
  • ビュー2つ

を用意してみました。

package Hello;

use strict;
use warnings;

use Catalyst qw/-Debug Dumper Static::Simple/;

our $VERSION = '0.01';

__PACKAGE__->config( name => 'Hello' );
__PACKAGE__->setup;

sub default : Private {
    my ( $self, $c ) = @_;
}

sub end : Private {
    my ( $self, $c ) = @_;
    $c->stash->{'body'} = $c->welcome_message() unless (length($c->stash->{'body'}) > 0);
    $c->log->debug($c->stash->{'body'});
    $c->response->header('Content-Type' => 'text/html; charset=euc-jp');
    $c->response->body(sprintf(qq!<html><body>%s</body></html>!, $c->stash->{'body'}));
    return $c->response->body;
}

1;
package Hello::BaseController;

use strict;
use warnings;
use base 'Catalyst::Controller';

# 使用するビューを返す
sub get_view : Private {
    die "must implements at child class";
}

# どのアクションにも一致しなかったら呼ばれる
sub default : Private {
    my ( $self, $c ) = @_;
    $c->forward($self->get_view(), 'default');
}

# 追加アクション
sub add : Local {
    my ( $self, $c ) = @_;
    $c->forward($self->get_view(), 'add');
}

# 無効化アクション
sub disable : Local {
    my ( $self, $c ) = @_;
    $c->forward($self->get_view(), 'disable');
}

# 削除アクション
sub delete : Local {
    my ( $self, $c ) = @_;
    $c->forward($self->get_view(), 'delete');
}

# 詳細表示アクション
sub view : Local {
    my ( $self, $c ) = @_;
    $c->forward($self->get_view(), 'view');
}

# 編集アクション
sub edit : Local {
    my ( $self, $c ) = @_;
    $c->forward($self->get_view(), 'edit');
}

# 一覧アクション
sub list : Local {
    my ( $self, $c ) = @_;
    $c->forward($self->get_view(), 'list');
}

1;
package Hello::BaseView;

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

sub default {
    my ( $self, $c ) = @_;
    $c->stash->{body} = ref($self) . ":default<br>\n";
}

sub add {
    my ( $self, $c ) = @_;
    $c->stash->{body} = ref($self) . ":add<br>\n";
    my @args = @{$c->req->args};
    foreach my $arg (@args) {
        $c->stash->{body} .= sprintf(qq!arg: %s<br>\n!, $arg);
    }
}

sub disable {
    my ( $self, $c ) = @_;
    $c->stash->{body} = ref($self) . ":disable<br>\n";
    my @args = @{$c->req->args};
    foreach my $arg (@args) {
        $c->stash->{body} .= sprintf(qq!arg: %s<br>\n!, $arg);
    }
}

sub delete {
    my ( $self, $c ) = @_;
    $c->stash->{body} = ref($self) . ":delete<br>\n";
    my @args = @{$c->req->args};
    foreach my $arg (@args) {
        $c->stash->{body} .= sprintf(qq!arg: %s<br>\n!, $arg);
    }
}

sub view {
    my ( $self, $c ) = @_;
    $c->stash->{body} = ref($self) . ":view<br>\n";
    my @args = @{$c->req->args};
    foreach my $arg (@args) {
        $c->stash->{body} .= sprintf(qq!arg: %s<br>\n!, $arg);
    }
}

sub edit {
    my ( $self, $c ) = @_;
    $c->stash->{body} = ref($self) . ":edit<br>\n";
    my @args = @{$c->req->args};
    foreach my $arg (@args) {
        $c->stash->{body} .= sprintf(qq!arg: %s<br>\n!, $arg);
    }
}

sub list {
    my ( $self, $c ) = @_;
    $c->stash->{body} = ref($self) . ":list<br>\n";
    my @args = @{$c->req->args};
    foreach my $arg (@args) {
        $c->stash->{body} .= sprintf(qq!arg: %s<br>\n!, $arg);
    }
}

1;
package Hello::Controller::Form1;

use strict;
use warnings;
use base 'Hello::BaseController';

# 使用するビューを返す
sub get_view : Private {
    my ( $self, $c ) = @_;
    return "Hello::View::Form1";
}

1;
package Hello::Controller::Form2;

use strict;
use warnings;
use base 'Hello::BaseController';

# 使用するビューを返す
sub get_view : Private {
    my ( $self, $c ) = @_;
    return "Hello::View::Form2";
}

1;
package Hello::View::Form1;

use strict;
use warnings;
use base 'Hello::BaseView';

# 各メソッドをオーバーライドして使います

1;
package Hello::View::Form2;

use strict;
use warnings;
use base 'Hello::BaseView';

# 各メソッドをオーバーライドして使います

1;