Catalyst-Plugin-CRUD (4)

先ほどのエントリーまでで、モデル・ビューを作ったので、最後にコントローラです。といっても基本的なコントローラはもう作られていますので、そんなに必要なことはありません。

TinyURL/lib/TinyURL.pm の修正

以下のように修正します。

use Catalyst qw/-Debug ConfigLoader I18N CRUD Static::Simple/;

TinyURL/lib/TinyURL/Controller/TinyURL.pm の修正

自動的に作られたソースは以下のようになっていると思います。

package TinyURL::Controller::TinyUrl;

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

sub default : Private {
    my ( $self, $c ) = @_;
    $c->forward('list');
}

sub create : Local {
    my ( $self, $c ) = @_;
    $c->create($self);
}

sub read : Local {
    my ( $self, $c ) = @_;
    $c->read($self);
}

sub update : Local {
    my ( $self, $c ) = @_;
    $c->update($self);
}

sub delete : Local {
    my ( $self, $c ) = @_;
    $c->delete($self);
}

sub list : Local {
    my ( $self, $c ) = @_;
    $c->list($self);
}

sub setting {
    my ( $self, $c ) = @_;
    my $hash = {
        'name'     => 'tinyurl',
        'type'    => 'CDBI',
        'model'    => 'CDBI::TinyUrl',
        'primary'  => 'id',
        'columns'  => [qw(disable long_url)],
        'default'  => '/tinyurl/list',
        'template' => {
            'prefix' => 'template/tinyurl/',
            'create' => 'create.tt',
            'read'   => 'read.tt',
            'update' => 'update.tt',
            'delete' => 'delete.tt',
            'list'   => 'list.tt'
        },
    };
    return $hash;
}

1;
  • たとえば、新規作成・参照のみ可能で、他のアクションは無効にしたいときは、read, update, delete をコメントアウトするだけです
  • setting の中身は見れば大体わかると思います
    • $c が渡ってくるので、なにかの条件で返す値を変えるようなこともできます
    • ビューに ClearSilver を使う場合は .tt を .cs に変えてください

入力した値をエラーチェックする

とりあえず空の URL は登録させたくないので、エラーチェックを追加しましょう。

  • TinyURL/lib/TinyURL/Controller/TinyURL.pm に以下のように追加します
    • $hash の中に入力値が入っています
    • $c->stash->{create}->{error} に値を入れることで、入力画面にエラーが表示されます
__PACKAGE__->add_trigger(create_check => \&create_check);
sub create_check {
    my ( $self, $c, $hash ) = @_;

    if (!exists $hash->{long_url} or length($hash->{long_url}) == 0) {
        $c->stash->{create}->{error} = 'URLが空っぽです。';
    }
}

他にどんなトリガーがあるかは、Catalyst::Controller::CRUD を読んでくださいね。

エラーメッセージの国際化

先ほどの例では、エラーメッセージが日本語だったので、国際化に対応させてみます。

  • 以下のように修正します
$c->stash->{create}->{error} = $c->language('ERROR_URL_IS_NULL');
msgid "ERROR_URL_IS_NULL"
msgstr "URLが空っぽです。"
msgid "ERROR_URL_IS_NULL"
msgstr "Error: URL is null."

最終的な TinyURL/lib/TinyURL/Controller/TinyURL.pm

package TinyURL::Controller::TinyUrl;

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

sub default : Private {
    my ( $self, $c ) = @_;
    $c->forward('create');
}

sub create : Local {
    my ( $self, $c ) = @_;
    $c->create($self);
}

__PACKAGE__->add_trigger(create_check => \&create_check);
sub create_check {
    my ( $self, $c, $hash ) = @_;

    if (!exists $hash->{long_url} or length($hash->{long_url}) == 0) {
        $c->stash->{create}->{error} = $c->language('ERROR_URL_IS_NULL');
    }
}

sub list : Local {
    my ( $self, $c ) = @_;
    $c->list($self);
}

sub setting {
    my ( $self, $c ) = @_;
    my $hash = {
        'name'     => 'tinyurl',
        'type'    => 'CDBI',
        'model'    => 'CDBI::TinyUrl',
        'primary'  => 'id',
        'columns'  => [qw(disable long_url)],
        'default'  => '/tinyurl/list',
        'template' => {
            'prefix' => 'template/tinyurl/',
            'create' => 'create.tt',
            'read'   => 'read.tt',
            'update' => 'update.tt',
            'delete' => 'delete.tt',
            'list'   => 'list.tt'
        },
    };
    return $hash;
}

1;