はじめに
PerlでCGIアプリケーションを作るフレームワークの1つが、CGI::Applicationです。CGI::ApplicationにはどのようなCGIアプリケーションにも必ず存在する定型処理があらかじめ用意されており、自ら記述するコードの量を減らすことができます。また、プラグインによって、足りない機能を補えます。本稿では、CGI::Applicationとデータベースを用いた基礎的なCGIアプリケーションの実装方法を解説します。
対象読者
- Perlで何らかのCGIアプリケーションを作成したことのある方。
- CGI、DBI、HTML::Templateモジュールを使用したことのある方。
- フレームワークを使用したことのない方。
動作環境
Perl 5.8以降を使ったCGIアプリケーションが正しく動作するWebサーバが必要です。また、以下の依存モジュールをCPANで導入しておいてください。
DBI DBD::SQLite CGI::Application CGI::Application::Plugin::DBH CGI::Application::Plugin::Forward
ActivePerl 5.8を利用している場合、代わりにppmコマンドで導入してください。コマンドプロンプトを開き、次のように入力します。
C:\Perl>ppm PPM - Programmer's Package Manager version 3.4. Copyright (c) 2001 ActiveState Software Inc. All Rights Reserved. Entering interactive shell. Using Term::ReadLine::Perl as readline library. Type 'help' to get started. ppm>install DBI ppm>install DBD::SQLite ppm>install CGI::Application ppm>install CGI::Application::Plugin::DBH ppm>install CGI::Application::Plugin::Forward ppm>quit
もしモジュールが見つからずインストールできない場合は、installの前に以下を実行し、ActiveState社以外のppmサーバを追加した後で再度インストールを試みてください。
ppm>rep add Winnipeg http://theoryx5.uwinnipeg.ca/cgi-bin/ ppmserver?urn:/PPMServer58
本稿ではデータベースとしてSQLiteを用います。DBD::SQLiteモジュールにデータベースアクセスに必要なライブラリも含まれているため、特に別途用意するものはありません。アーカイブにはテーブル定義済みのデータベースファイル「cashbook.db3」を添付しています。
まずは動かしてみよう
CGI::Applicationを利用したサンプルアプリケーションとして、「おこづかい帳」を用意しました。まずはこのアプリケーションを操作して、動作を見てみましょう。
パスの設定
ダウンロードしたアーカイブを展開し、テキストエディタなどで「cashbook.cgi」を開きます。「cashbook.cgi」の1行目を「perl」(もしくは「perl.exe」)の存在するパスに変更してください。
#!/usr/bin/perl ←ここを変更 use strict; use Cashbook; my $app = Cashbook->new( PARAMS => { db_dsn => 'dbi:SQLite:cashbook.db3', db_user => '', db_pass => '' } ); $app->run();
テキストエディタはWindowsに付属のメモ帳でも構いませんが、UTF-8やLF改行コードに対応したものをお勧めします。筆者はサクラエディタというフリーウェアを使っています。
#!perl
とだけ指定すると動く場合もあります。ファイルの配置
Webサーバにファイルを配置します。各ファイルのパーミッションと転送モードは次のとおりです。必要に応じて参照してください。
ファイル名 | パーミッション | 転送モード |
cashbook.cgi | 705 | ASCII |
Cashbook.pm | 604 | ASCII |
insert_input.tmpl | 604 | ASCII |
update_input.tmpl | 604 | ASCII |
view.tmpl | 604 | ASCII |
default.css | 604 | ASCII |
cashbook.db3 | 606 | Binary |
initdb.sql | - | 転送不要 |
ブラウザでアクセス
ブラウザに配置先のURLを入力すると、図1のような「一覧」画面が表示されます。
図中の[追加]ボタンを押すと入力画面に遷移します。1つでも項目がある状態だと、[編集]や[削除]ボタンも使用可能です。適当に遊んでみてください。
CGI::Applicationの基本
CGI::Applicationを利用するCGIアプリケーションは、CGI::Applicationを基本クラスとする派生クラスとして実装しなければなりません。本稿のサンプルではCashbookというパッケージを「Cashbook.pm」に実装しています。これを「cashbook.cgi」内でインスタンス化し、run
メソッドを呼び出して実行しています。
テキストエディタで「Cashbook.pm」を開いてください。4行目がCGI::Applicationを基本クラスにしている部分です。5~6行目はCGI:Applicationのプラグインモジュールのロードを行っており、それぞれデータベースアクセスとモードの強制遷移(後述)をサポートします。
1 package Cashbook; 2 use 5.0008; 3 use strict; 4 use base qw(CGI::Application); 5 use CGI::Application::Plugin::DBH qw(dbh_config dbh); 6 use CGI::Application::Plugin::Forward; 7 use vars qw($VERSION); 8
一般的に、CGIアプリケーションはいくつかの「モード」から構成されます。先ほど動かしたときに気付かれたと思いますが、「一覧」「追加」「編集」「削除」のモードがあり、それぞれ機能と画面を持っています。さらに細かく見ると「追加」や「編集」のモードは「入力」と「実行」の2段階に分かれています。
CGI::Applicationにはモードの概念があり、初期化を済ませた後、それぞれのモードに対応するサブルーチンを呼び出す仕組みになっています。モードはクエリ文字列中のパラメータ「rm」として渡します。例えば"cashbook.cgi?rm=view"
の場合、"view"
がモードとなります。モードを処理するサブルーチンの戻り値がブラウザに返すHTMLとなります。
「Cashbook.pm」の34~41行目で各モードに対応するサブルーチンの名前を指定しています。32行目のerror_mode
メソッドはdieなどで例外が発生した場合に強制的に遷移するモードを設定します。33行目のstart_mode
メソッドはクエリ文字列中にモードを指定するパラメータが無かった場合のモードを指定します。
26 ### 27 ### モードの設定 28 ### 29 sub setup { 30 my $self = shift; 31 32 $self->error_mode('error'); 33 $self->start_mode('view'); 34 $self->run_modes( 35 'view' => 'view', 36 'insert_input' => 'insert_input', 37 'insert_finish' => 'insert_finish', 38 'update_input' => 'update_input', 39 'update_finish' => 'update_finish', 40 'delete_finish' => 'delete_finish', 41 ); 42 }
初期化も含めた「Cashbook.pm」内の全体的なプログラムの流れをまとめると図2の通りです。