今回はデータベースも用いて、MVCフレームワークの実現の様子を辿っていきたいと思います。
実験ってことでRDBはSQLiteを使うことにしました。
基本的にPerl の MVC フレームワーク Catalyst に入門してみたを参考にしています。
そちらと併せながら読んでいただければと存じます。
■SQLiteの準備
SQLiteをダウンロードします。
上記リンク内のPrecompiled Binaries For Windows内の最新版†1を取得し、解凍するとsqlite3.exeというファイルが展開されます。
パスの通った適当なフォルダ(例えばD:\usr\local\bin)に置きます。
まぁ最悪プロジェクトフォルダ内に置いてもいいんですが。
■DBIの準備
次にSQLite関連のDBIを突っ込みます。
PPMコマンドでClass-DBI-Sqliteをインストールします。
細かいところは全部中略しますね。
D:\>ppm install Class-DBI-Sqlite ==================== Install 'DBIx-ContextualFetch' version 1.02 in ActivePerl 5.8.4.810. ==================== ==================== Install 'Class-WhiteHole' version 0.04 in ActivePerl 5.8.4.810. ==================== ==================== Install 'Ima-DBI' version 0.33 in ActivePerl 5.8.4.810. ==================== ==================== Install 'DBD-SQLite' version 1.09 in ActivePerl 5.8.4.810. ==================== ==================== Install 'IO-stringy' version 2.110 in ActivePerl 5.8.4.810. ==================== ==================== Install 'Class-Trigger' version 0.09 in ActivePerl 5.8.4.810. ==================== ==================== Install 'UNIVERSAL-moniker' version 0.08 in ActivePerl 5.8.4.810. ==================== ==================== Install 'Class-DBI' version 0.96 in ActivePerl 5.8.4.810. ==================== ==================== Install 'Class-DBI-Sqlite' version 0.09 in ActivePerl 5.8.4.810. ====================
■プロジェクトの作成
Catalyst.batでPeturlを作り†2、Template::ToolkitなViewを作ります。
D:\Catalyst>catalyst.bat Peturl created "Peturl" created "Peturl\script" created "Peturl\lib" created "Peturl\root" created "Peturl\t" created "Peturl\t\m" created "Peturl\t\v" created "Peturl\t\c" created "Peturl\lib\Peturl" created "Peturl\lib\Peturl\M" created "Peturl\lib\Peturl\V" created "Peturl\lib\Peturl\C" created "Peturl\lib\Peturl.pm" created "Peturl/Build.PL" created "Peturl/Makefile.PL" created "Peturl/README" created "Peturl/Changes" created "Peturl\t/01app.t" created "Peturl\t/02pod.t" created "Peturl\t/03podcoverage.t" created "Peturl\script/Peturl_cgi.pl" created "Peturl\script/Peturl_fastcgi.pl" created "Peturl\script/Peturl_server.pl" created "Peturl\script/Peturl_test.pl" created "Peturl\script/Peturl_create.pl" D:\Catalyst>cd Peturl D:\Catalyst\Peturl>perl .\script\Peturl_create.pl view TT TT created "D:\Catalyst\Peturl\lib\Peturl\V\TT.pm" created "D:\Catalyst\Peturl\t\v\tt.t"
■DBの作成
SQLite(SQLite3.exe)でDBの物理ファイルを作ります。
次のSQL文を用意して実行するとD:\Catalyst\Peturl\tinyurl.dbというファイルが出来ます。
D:\Catalyst\Peturl>type setup.sql CREATE TABLE tinyurl ( id TEXT PRIMARY KEY, longurl TEXT ); D:\Catalyst\Peturl>sqlite3 .\tinyurl.db < setup.sql
■Modelの作成
MVCでいうところのM(=model)の作成。
案の定エラーが出ました。
D:\Catalyst\Peturl>perl .\script\Peturl_create.pl model CDBI CDBI dbi:SQLite:D:\ Catalyst\Peturl\tinyurl.db Couldn't load helper "Catalyst::Helper::Model::CDBI", "Can't locate Catalyst/Hel per/Model/CDBI.pm in @INC (@INC contains: D:/usr/local/perl/lib D:/usr/local/per l/site/lib .) at (eval 34) line 3. " at D:/usr/local/perl/site/lib/Catalyst/Helper.pm line 148.
CPANからCatalyst-Model-CDBIを取得。
再びコマンド実行すると、今度はClass::DBI::Loaderが足りない模様。
これはppmで提供されているのでこちらから取得しました。
D:\Catalyst\Peturl>ppm install Class-DBI-Loader
そして、リトライ。
D:\Catalyst\Peturl>perl .\script\Peturl_create.pl model CDBI CDBI dbi:SQLite:D:// Catalyst/Peturl/tinyurl.db created "D:\Catalyst\Peturl\lib\Peturl\M\CDBI.pm" created "D:\Catalyst\Peturl\lib\Peturl\M\CDBI" created "D:\Catalyst\Peturl\lib\Peturl\M\CDBI\Tinyurl.pm" created "D:\Catalyst\Peturl\t\m\cdbi_tinyurl.t"
■Peturl.pmの修正
ベースはPerl on Rails な Catalyst を試すのソースなのですが、Peturl.pmについては以下のような感じに書換えています。
sub default : Private { my ( $self, $c ) = @_; my $key = $c->req->path; $key =~ s/^\///; if ($key and $key ne 'create') { my $t = Peturl::M::CDBI::Tinyurl->retrieve($key) or die $!; $c->res->redirect($t->longurl); } $c->stash->{template} = 'index.tt'; $c->forward('Peturl::V::TT'); } sub create : Global { my ( $self, $c ) = @_; my $longurl = $c->req->params->{longurl}; $longurl = 'http://' . $longurl unless $longurl =~ /^http(?s):\/\//i; my $tinyurl = Peturl::M::CDBI::Tinyurl->search_or_generate($longurl); $c->stash->{tinyurl} = $tinyurl; $c->stash->{template} = 'index.tt'; $c->forward('Peturl::V::TT'); }
■テスト
ではHTTPdを起動して、http://localhost:3000/にアクセスしてみましょう。
D:\Catalyst\peturl>perl .\script\peturl_server.pl
動きました†3。
今回はプロジェクト作成時にPeturlとpeturlのtypoをしてしまい、 $c->forward('Peturl::V::TT');の処理で「Peturl::V::TTが見つからんよ」と随分怒られました。
当たり前っちゃ当たり前なのですが、もしこういうことがあればpackege名を見つめなおす必要があるかもしれませんね。
とりあえず簡単なアプリが構築できるのが分かったので、何かもう少しボリュームのある作例でCatalystと付き合ってみたいと思います。