Catalystでシンプルなアプリケーションの作成

★インストール

#Session
cpan install Catalyst::Plugin::Session::Store::File
cpan install Catalyst::Plugin::Session::Store::FastMmap
cpan install Catalyst::Plugin::Session::State::Cookie
cpan install Catalyst::Plugin::Session
cpan install Catalyst::Plugin::Session::State::Cookie
cpan install Catalyst::Plugin::Session::Store::DBI
#DB
yum install mysql-devel
cpanm DBD::mysql
cpan install Catalyst::Model::DBIC::Schema
cpan install DBIx::Class::Schema::Loader
cpan install MooseX::MarkAsMethods;
cpan install MooseX::NonMoose;
cpan install Catalyst::Helper::Model::DBI;
#View
cpan install Catalyst::View::TT;
cpan install next;

★基本編

アプリケーションのカレントを作成する
cd /var/www/
catalyst.pl Bookmark
開発サーバーの立ち上げ
env DBIC_TRACE=1 ./script/bookmark_server.pl -r
Controllerの作成
./script/bookmark_create.pl controller login
vim /var/www/Bookmark/lib/Bookmark/Controller/login.pm
下記のようにテンプレートを指定する
sub top :Local{
  my($self,$c)=@_;
  $c->stash->{template} = 'login/top.tt';
}
sub confirm :Local{
  my($self,$c)=@_;
  $c->stash->{template} = 'login/confirm.tt';
}
sub execute :Local{
  my($self,$c)=@_;
  $c->stash->{template} = 'login/execute.tt';
}
Modelの作成(DBIC::Schemaを使用してO/RマッパーによるDBアクセス)

MySQLのテーブルを作り変える度に実行する事!

./script/xxxx_create.pl model OhenroDB2 DBIC::Schema OhenroDB2::Schema create=static dbi:mysql:database=testdb:host=49.212.2.xxx user pass

Controllerの記述方法->
Catalyst::Model::DBIC::Schemaでselect,insert,updateとかのメモ
http://d.hatena.ne.jp/oggata/20120609/1339232476

Modelの作成2(DBIを用いてそのままSQLを実行する。複雑なjoinなどに利用)
./script/xxxx_create.pl model SimpleDB DBI dbi:mysql:database=testdb:host=49.212.2.xxx user pass

Controllerの記述方法->

sub dbi :Local{
  my($self,$c)=@_;
  my $db = $c->model('Catal')->dbh;
  $db->do('set names utf8');
  my $stt = $db->prepare('select * from book order by published desc');
  $stt->execute();
  my @data = ();
  while(my $row=$stt->fetchrow_hashref()){
  	push @data,$row;
  }
  $c->stash->{list}=\@data;
  $c->stash->{template}='list.tt';
}
Viewの作成
./script/bookmark_create.pl view TT TT
mkdir /var/www/Bookmark/root/login
vim /var/www/Bookmark/root/login/top.tt
vim /var/www/Bookmark/root/login/confirm.tt
vim /var/www/Bookmark/root/login/execute.tt
TT(テンプレートツールキット)の設定ファイルに追記※これを追記しないとTTを相対パスで指定できない
vim /var/www/Bookmark/lib/Bookmark/View/TT.pm
__PACKAGE__->config(
    TEMPLATE_EXTENSION => '.tt',
    render_die => 1,
    RELATIVE => 1,
    ABSOLUTE => 1,
);

★セッション編(FastMmap+Cookieの組み合わせの場合)--------------------------------------------------------

[Server]
Store::File セッションをファイルに保存
Store::FastMmap セッションをメモリマップファイルに保存
Store::Memcached セッションをmemcachedに保存
Store::DBIC セッションをDBIx::Class対応DBに保存
Store::DBI セッションをDBI対応DBに保存
[Client]
Store::Cookie セッションIDのやりとりにクッキーを使用する
Store::URI セッションのやりとりにURIを使用
Store::Stash セッションのやりとりにStashを使用

#/[app名]/lib/[app名].pm
use Catalyst qw/
   -Debug
   ConfigLoader
   Static::Simple
   Session
   Session::State::Cookie
   Session::Store::FastMmap
/

__PACKAGE__->config(
  session => {
     expires => 1000,
     storage  => '/tmp/session'
  },
);

★セッション編(DBI+Cookieの組み合わせの場合)--------------------------------------------------------

http://search.cpan.org/~flora/Catalyst-Plugin-Session-Store-DBI-0.16/lib/Catalyst/Plugin/Session/Store/DBI.pm
http://search.cpan.org/~flora/Catalyst-Plugin-Session-Store-DBIC-0.12/lib/Catalyst/Plugin/Session/Store/DBIC.pm

#MySQLにセッション管理用のテーブルを作成

CREATE TABLE sessions (
id           char(72) primary key,
session_data text,
expires      int(10)
);
#/[app名]/lib/[app名].pmを下記のように追記する
use Catalyst qw/
    -Debug
    ConfigLoader
    Static::Simple
    Session
    Session::State::Cookie
    Session::Store::DBI
/;

__PACKAGE__->config(
    name => 'Bookmark',
    # Disable deprecated behavior needed by old applications
    disable_component_resolution_regex_fallback => 1,
    enable_catalyst_header => 1, # Send X-Catalyst header
    #session => {
    #  expires => 1000,
    #  storage  => '/tmp/session'
    #},
    'Plugin::Session' => {
      expires   => 3600,
      dbi_dsn   => 'dbi:mysql:database=testdb:host=49.212.2.106',
      dbi_user  => 'userid',
      dbi_pass  => 'password',
      dbi_table => 'sessions',
      dbi_id_field => 'id',
      dbi_data_field => 'session_data',
      dbi_expires_field => 'expires',
    }
);
#Controller側では普通に使う
#セッションを保存
$c->session->{session_name}='testtest';
#セッションを呼出し
my $session_name = $c->session->{session_name};

oracle用もあったりする
Apache::Session::Store::Oracle

セッションとDBを連携したりする
use base 'DBIx::Class::Schema';

sub top :Local{
  my($self,$c)=@_;
  $c->stash->{template} = 'login/top.tt';
}

sub confirm :Local{
  my($self,$c)=@_;
  #session  
  $c->session->{login_id} = $c->request->body_params->{'login_id'};
  $c->session->{login_passwd} = $c->request->body_params->{'login_passwd'};
  #view
  $c->stash->{template} = 'login/confirm.tt';
  $c->stash->{login_id} = $c->request->body_params->{'login_id'};
  $c->stash->{login_passwd} = $c->request->body_params->{'login_passwd'};
}

sub execute :Local{
  my($self,$c)=@_;
  #session
  my $login_id = $c->session->{login_id};
  my $login_passwd = $c->session->{login_passwd};
  #DB insert
  my $row = $c->model('MyDB2::Member')->create({
    name => $login_id,
    password => $login_passwd,
    last_update_date => \'NOW()'
  });
  #view
  $c->stash->{template} = 'login/execute.tt';
  $c->stash->{login_id} = $login_id;
  $c->stash->{login_passwd} = $login_passwd;
}

JSONを使う

Catalyst::View::JSONのインストール

# cpanm Catalyst::View::JSON

②ビュークラスの作成

./script/uranai_create.pl view JSON JSON

③コントローラーの作成
use base qw( Catalyst::View::JSON );
sub test :Local {
  my($self, $c) = @_;
  $c->stash->{tags}=[qw/foo bar bax/];
  $c->forward('View::JSON');
}