m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

Amon2のチュートリアルをやってみた

最初はチュートリアルから

基本的なデータベースやルーティングなどを理解する意味でやってみる

手順

雛形を作成して必要なモジュールをインストールしておく
amon2-setup.pl BBS
cd BBS/
carton install
sql/sqlite.sql を編集
CREATE TABLE IF NOT EXISTS member (
    id           INTEGER NOT NULL PRIMARY KEY,
    name         VARCHAR(255)
);

CREATE TABLE IF NOT EXISTS sessions (
    id           CHAR(72) PRIMARY KEY,
    session_data TEXT
);

CREATE TABLE IF NOT EXISTS entry (
    entry_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    body varchar(255) not null
);
sqlを実行
sqlite3 db/development.db < sql/sqlite.sql
テーブルを確認
$ sqlite3 db/development.db
SQLite version 3.6.20
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
entry     member    sessions
sqlite> 
config/development.pl で接続用の設定を追加
use File::Spec;
use File::Basename qw(dirname);
my $basedir = File::Spec->rel2abs(File::Spec->catdir(dirname(__FILE__), '..'));
my $dbpath = File::Spec->catfile($basedir, 'db', 'development.db');
+{
    'DBI' => [
        "dbi:SQLite:dbname=$dbpath", '', '',
        +{
            sqlite_unicode => 1,
        }
    ],
};
一度起動する

f:id:m_shige1979:20141221234559p:plain
※hostは’0.0.0.0’にしておく

lib/BBS/DB/Schema.pmにテーブルなどの設定を追加
package BBS::DB::Schema;
use strict;
use warnings;
use utf8;

use Teng::Schema::Declare;

base_row_class 'BBS::DB::Row';

table {
    name 'sessions';
    pk 'id';
    columns qw(session_data);
};

table {
    name 'entry';
    pk 'entry_id';
    columns qw(entry_id body);
};

1;
lib/BBS/Web/Dispatcher.pmでルーティングの設定
package BBS::Web::Dispatcher;
use strict;
use warnings;
use utf8;
use Amon2::Web::Dispatcher::RouterBoom;

any '/' => sub {
    my ($c) = @_;

    my @entries = $c->db->search(
        entry => {
        }, {
            order_by => 'entry_id DESC',
            limit    => 10,
        }
    );
    return $c->render( "index.tx" => { entries => \@entries, } );
};

post '/post' => sub {
    my ($c) = @_;

    if (my $body = $c->req->param('body')) {
        $c->db->insert(
            entry => +{
                body => $body,
            }
        );
    }
    return $c->redirect('/');
};

1;
tmpl/index.txでテンプレートを編集
: cascade "include/layout.tx"

: override content -> {

<form method="post" action="<: uri_for('/post') :>">
    <input type="text" name="body" />
    <input type="submit" value="Send" />
</form>

<ul>
    <: for $entries -> $entry { :>
    <li><: $entry.entry_id :>. <: $entry.body :></li>
    <: } :>
</ul>

: }
実行

f:id:m_shige1979:20141222013553g:plain

所感

よく勉強会とかではamon2で作った的なことを聞いていてMojoliciousで作ったようなことを聞いてみないのでやってみました。
まだ、チュートリアルだけなので実感がわかないけどamon2はいろいろなモジュールをたくさん使用している感じでMojolicousのように1つになっていないのでモジュールを使用する場合はcartonで制限したほうが動かすときに安全な感じがしました。

また、いろいろと触ってみて理解していこう

今日はここまで