15
13

More than 5 years have passed since last update.

MojocliciousでTengを使う設定

Last updated at Posted at 2014-05-23

概要

MojoliciousにはO/RマッパはないのでTengを導入する。

Tengのインストール

cpanmでインストールする。
また、hookを設定するために、
Class::Method::Modifiersもインストールする。

$ cpanm Teng Class::Method::Modifiers

Tengのファイルを作成する

lib/MyApp/DB.pmというファイルを作成する。
このファイルでは以下のような設定を記述する。

  • Tengを継承
  • 有効にしたいプラグインの設定
  • hookの設定

プログラムは以下のような内容になる。

lib/MyApp/DB.pm
package MyApp::DB;
use parent 'Teng';
use DateTime;

# プラグイン有効
__PACKAGE__->load_plugin('Pager');
__PACKAGE__->load_plugin('Count');

# hookの設定
use Class::Method::Modifiers;

# updateメソッド時にupdated_atに現在時刻を自動入力する
before update => sub {
    my ($self, $table_name, $update_row_data, $update_condition) = @_;
    if ( !$update_row_data->{updated_at} ) {
        $update_row_data->{updated_at} = DateTime->now->set_time_zone('Asia/Tokyo')->strftime('%Y-%m-%d %H:%M:%S');
    }
};

# insertメソッド時にupdated_at/created_atに現在時刻を自動入力する
before insert => sub {
    my ($self, $table_name, $row_data) = @_;
    $row_data->{created_at} = DateTime->now->set_time_zone('Asia/Tokyo')->strftime('%Y-%m-%d %H:%M:%S');
    $row_data->{updated_at} = DateTime->now->set_time_zone('Asia/Tokyo')->strftime('%Y-%m-%d %H:%M:%S');
};

# fast_insertメソッド時にupdated_at/created_atに現在時刻を自動入力する
before fast_insert => sub {
    my ($self, $table_name, $row_data) = @_;
    $row_data->{created_at} = DateTime->now->set_time_zone('Asia/Tokyo')->strftime('%Y-%m-%d %H:%M:%S');
    $row_data->{updated_at} = DateTime->now->set_time_zone('Asia/Tokyo')->strftime('%Y-%m-%d %H:%M:%S');
};


1;

hookの設定は、
全テーブルにcreated_at/updated_atのカラムが存在している前提の内容になっている。

次に、lib/MyApp/DB/Schema.pmを作成する。
このファイルでは以下のような設定をする。

  • Schemaの設定
  • inflate/deflateの設定

主にスキーマの設定をしていくが、
Teng::Schema::Loaderを使用している場合は、何も書かなくて良い。

lib/MyApp/Schema.pm
package AM::DB::Schema;
use Teng::Schema::Declare;
1;

スキーマ設定の書き方については、
以下のページが参考になる。
https://metacpan.org/pod/Teng::Schema::Declare

すでにDBにテーブルがあり、
スキーマ設定を一つ一つ書くのが面倒くさい場合は、
Teng::Schema::Dumperを使うと楽。
https://metacpan.org/pod/Teng::Schema::Dumper

Tengを参照する設定

Tengに参照するhelperを設定する。

myapp.pl
app->helper(
    db => sub {
        my $c = shift
        $c->{___myapp_db} ||= do {
            my $dbh = DBI->connect(@config);
            Teng::Schema::Loader->load(
                namespace => 'MyApp::DB',
                dbh       => $dbh,
            );
        };
        return $c->{___myapp_db};
    }
);

この設定で、Controllerから$self->dbでTengを参照することができる。

myapp.pl
get '/' => sub {
    my $self = shift;

    $self->stash->{users} = [$self->db->search('users')];

    $self->render();
};

実際はController内でDBの処理は書かずに、
Modelに渡すなどしたほうが良い。

Teng自体の使い方は、以下のページが参考になる。

クイックスタート - Teng-Doc 0.01 documentation
http://walf443.github.io/teng-doc/quickstart.html

15
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
13