NanoA というウェブアプリケーションフレームワークをかいてみた

CGI というシーンにおける現状の Perlウェブアプリケーションフレームワークの問題点とは

といったあたりであると認識している。

http://d.hatena.ne.jp/tokuhirom/20081111/1226418572

自分は、SledgeCatalystMojoRails も boofy も使ったことがありませんが、別に必要なモジュールをロードしたり bless したりするのはしょうがないのかなと思います。ただ、

  • 不要なコントローラ (+それに伴う多数のモジュール) までロードしている

ということが一番の問題なのかなと思いました。というわけで作った。

CodeRepos の /lang/perl/NanoA

特徴はコントローラの遅延ロードとディスパッチテーブルレス設計。売りは、ビューをいっぱい足して行っても速度が落ちないよ、というところ (モデルは DBI!)。以下使い方。

以下の使い方は古いです。今はもっと簡単。Nanoa のアプリケーション開発手法 - kazuhoのメモ置き場

1. index.cgi を書く


ウェブアプリケーション全体の初期化コードやフックは、全て index.cgi に書きます。

#! /usr/bin/perl

use strict;
use warnings;

use lib qw(../lib);
use NanoA;

NanoA::Dispatch->dispatch({
    prefix => 'MyApp',
    # prerun => sub {},
    # postrun => sub {},
    # dbh => DBI->connect(...),
    # some_config => xyz,
});

2. 各コントローラを書く

コントローラのパスは prefix/path_info になります。つまり、index.cgi で prefix => 'MyApp' とした場合、実行されるコントローラは、

  • index.cgi => MyApp.pm
  • index.cgi/hello => MyApp/hello.pm

のようになります。各コントローラは NanoA.pm を継承して run メソッドを定義するだけです。こんな感じ。

package MyApp::hello;

use strict;
use warnings;

use base qw/NanoA/;

sub run {
    my $self = shift;
    my $name = $self->query->param('name');
    $self->header_add(
        -type => 'text/plain',
    );
    return << "EOT";
Hello, $name!
EOT
    ;
}

1;

テンプレートエンジンとかは好きにしてください。

kazuhoware 的には、むしろ Filter::SQLASP っぽく書けるようにしたい... それで速度が出るのかはわかりませんが。

NanoA を ASP 化 (PHP 化) した - kazuhoのメモ置き場 へ続きます