MVCのモデルみたいな感じにしようと画策中
データベースを接続する際は毎回接続するのはちょっと面倒臭いのでなんか1つの場所で接続して使用した方がいいはず。
構成
. ├── config.pl ├── lib │ ├── Config │ │ └── App.pm │ ├── DB │ │ └── Schema.pm │ ├── DB.pm │ ├── Model │ │ ├── App.pm │ │ └── Posts.pm │ └── Model.pm └── sample.pl
設定
config.pl
{ connect_info => [ 'dbi:mysql:sample_db1:localhost', 'root', undef ] }
Config
Config::App.pm
package Config::App{ use Mouse; use Config::PL; sub config{ return config_do "config.pl"; } __PACKAGE__->meta->make_immutable(); } 1;
※Config::PLでconfig.plを読み込む
DB
DB.pm
package DB; use parent 'Teng'; 1;
DB::Schema.pm
package DB::Schema; use strict; use warnings; use Teng::Schema::Declare; table{ name 'posts'; pk 'id'; columns qw/id title body/; }; 1;
Model
Model.pm
package Model{ use Mouse; use DB; use Config::App; has 'db' => ( is => 'ro', isa => 'DB', lazy_build => 1 ); has 'connect_info' => ( is => 'ro', isa => 'ArrayRef', lazy_build => 1 ); sub _build_connect_info{ my $self = shift; Config::App::config->{connect_info}; } sub _build_db{ my $self = shift; DB->new( connect_info => $self->connect_info ); } __PACKAGE__->meta->make_immutable(); } 1;
Model::App.pm
package Model::App{ use Mouse; use Model; extends Model; has 'table' => ( is => 'ro', isa => 'Str', ); sub find{ my ($self) = @_; my $data; $data = $self->db->single($self->table, {}); return $data; } __PACKAGE__->meta->make_immutable(); }
※Model.pmを継承して
Model::Posts
package Model::Posts{ use Mouse; use Model::App; extends Model::App; has 'table' => ( is => 'ro', isa => 'Str', default => 'posts' ); __PACKAGE__->meta->make_immutable(); }
※Model::Postsでテーブルを指定
実行ソース
#!/usr/bin/env perl use strict; use warnings; use FindBin; use lib "$FindBin::Bin/lib"; use Data::Dumper; use Model::Posts; my $model = new Model::Posts(); my $data = $model->find(); print Dumper($data->id, $data->title, $data->body);
↓
[vagrant@localhost teng2]$ perl sample.pl $VAR1 = '2'; $VAR2 = 'test2'; $VAR3 = 'body2'; [vagrant@localhost teng2]$
こんな感じかな?
機能やテーブルなどをうまく調整してメソッドを別途実装して個別対応していくことになるかも…
基本、phpやjavaしか知らないからそれぞれの言語に合わせた実装を理解する必要があります。
まとめ
perlを使用したModuleの使用にはまだ慣れていないけどなんとか形になってきた感じ。
何度も書いて検証を続けていかないと
ちょっとMojoliciousのサンプルで動かせるかなども検証する必要がある