インストール

まず、インストールの説明に従って、NanoA をインストールします。インストールが完了すると、こちらの画面が表示されるようになります。

Helloworld の作成

app/hello というディレクトリを作成し、以下のようなファイル (start.mt) を置きます。

app/hello/start.mt
こんにちは、<?= $app->query->param('user') ?>さん

続いて、NanoA のトップページをリロードしてみましょう。hello というアプリケーションが増えているはずです (今あなたが書いたアプリケーションです) 。そのアプリケーション名をクリックすると、「こんにちは、さん」と表示されます。

nanoa.cgi/hello/?user=太郎 という URL にアクセスすると、「こんにちは、太郎さん」と表示されます。

クエリパーサについて

NanoA は、クエリパーサとして CGI::Simple を同梱しています。上記の $app->query は、クエリオブジェクトを取得する処理です。リクエストのパースやファイルアップロードの受信、クッキー処理の手法については、CGI::Simple のドキュメントをご参照ください。

テンプレートエンジンについて

NanoA ではテンプレートエンジンに、Mojo::Template をベースにした MENTA::Template を採用し、PHP ライクな記法でテンプレートを書くことができます。文字列は自動でエスケープされるので、XSS 脆弱性を気にすることなく開発を進めることができます。

表. テンプレートの代表的な使い方
記法 意味
<?= $hoge ?> $hoge を HTML エスケープして出力
<?=r $hoge ?> $hoge をエスケープせずに出力
<?= $app->render('hello/header') ?> app/hello/header.mt をインクルード
? for my $row (@rows) {
<?= $row->{name} ?>
? }
リストを表示

テンプレートの分離

コードの見通しを良くするために、テンプレートとコントローラのロジックを分離して書くこともできます。Helloworld を分離して書き直すと、以下のようになります。極めて正統的な Perl です。

app/hello/start.pm
package hello::start;

use strict;
use warnings;
use utf8;

use base qw(NanoA);

sub run {
    my $app = shift;
    return $app->render('hello/template/start', {
        user => $app->query->param('user'),
    });
}

1;
app/hello/template/start.mt
こんにちは、<?= $c->{user} ?>さん

.pm ファイルと .mt ファイルについて

NanoA では、perl ソースコードに .pm 拡張子を、テンプレートに .mt 拡張子を使用するようになっています。NanoA のディスパッチャは、.mt と .pm ファイルを検索し、自動的に実行します。また、$app->render(filename) という呼出を行うことで、.pm の中で .mt ファイルをレンダリングしたり、逆に .mt ファイルの中から .pm ファイルを実行したりすることが可能です。

データベース接続

NanoA は標準で SQLite データベースへの接続機能を提供します。NanoA セットアップ時に自動的にデータベースが生成されるので、アプリケーションの中では、$app->db にアクセスするだけで、データベースハンドルを取得することができます。

データベース使用例
# ユーザーテーブルを (なければ) 作成
$app->db->do(
    'create table if not exists user ('
    . 'user_id integer not null primary key autoincrement,'
    . 'user_name text not null'
    . )'
);
...
# ユーザーテーブルに行を追加
$app->db->do(
    'insert into user (user_name) values (?)',
    {},
    $app->query->name('user_name'),
);
...
# ユーザーテーブルからクエリした結果をテンプレートに渡す
$app->render('myapp/template/mytemplate', {
    all_users => $app->db->selectall_arrayref(
        'select user_id,user_name from user',
        { Slice => {} },
    ),
});

データベースハンドルについて

NanoA のデータベースハンドルは、Perl 標準のデータベースインターフェイスである DBI です。

アプリケーションの設定

アプリケーション全体の共通処理

プラグイン機構

NanoA の動作は、プラグインを使って拡張可能です。詳しくは、プラグインの説明ページをご覧ください。