Akihiro's Programmer Blog

Technology Notes for Personal

Amon2の流れを掴む - 4


 前回の続きから。

 今回は lib/sample.pm の中身を見て行きます。


sample

package sample;
use strict;
use warnings;
use utf8;

 おなじみですね。


our $VERSION='0.01';

 バージョンの指定をしています。

  module として CPAN に上げたりする際にはきちんとバージョン指定しておくと親切かと思われます。

 また、開発中だったりする場合は、 '0.01_01' みたいな感じで _(アンダーバー) を入れたりするみたいです。


use 5.008001;

  Perl の特定バージョン以上での実行を保証しています。

 今回の場合、 perl 5.8 より低いバージョンで実行するとエラーになります。


use sample::DB::Schema;
use sample::DB;

  sample::DB は O/Rマッパーの Teng を継承しています。

  sample::DB::Schema ではTeng用のSchema設定をしています。


  • O/Rマッパーって?

 O/Rマッパーとは、 データベース(Relational DataBase)オブジェクト(Object) に紐付けることで、データベースの操作をより容易に安全に行うことが出来るフレームワークです。




use parent qw/Amon2/;

 そして Amon2 を継承します。


# Enable project local mode.
__PACKAGE__->make_local_context();

 次に Amon2::make_local_context を呼んでいます。

 こちらにも説明がある通り、2つ以上のアプリケーションを1つの PSGIアプリケーション で実現する際に必要になります。

 基本的に1つのアプリケーションしか考えていない場合は必要がないかもしれません。


my $schema = sample::DB::Schema->instance;

 ここでは Teng::Schema のオブジェクトを取得しています。

 後に出てくる Tengオブジェクト 生成時に使用します。


sub db {
    my $c = shift;
    if (!exists $c->{db}) {
        my $conf = $c->config->{DBI}
            or die "Missing configuration about DBI";
        $c->{db} = sample::DB->new(
            schema       => $schema,
            connect_info => [@$conf],
            # I suggest to enable following lines if you are using mysql.
            # on_connect_do => [
            #     'SET SESSION sql_mode=STRICT_TRANS_TABLES;',
            # ],
        );
    }
    $c->{db};
}

 最後に dbメソッド を定義しています。

 流れを読むと、

  1. sampleのコンテキストから db を呼ぶ
  2. すると Tengオブジェクト が返ってくる
  3. 2回目以降は $c->{db} にキャッシュしているので、それを返している

 という感じだと思われます。

 また、 $c->configconfigディレクトリ 以下の設定ファイルから設定を呼び出しているので、接続する DB を変えたければ、そちらを編集して行けば良いです。



 今回は短め。次回は Web の方を見に行ってみます。