MT::App::Liteを試してみた

@taijuさんが、「MT::App::Lite」というモジュールを公開されました。
RubyのWebアプリケーションフレームワークのSinatraのような書き方で、Movable Typeのフレームワークを生かしたアプリケーションを作れるというものです。
面白そうなので試してみました。

1.MT::App::Liteの概要

Movable Type自体は、シックスアパート謹製のWebアプリケーションフレームワーク(MT::App)をベースに作られています。
ただ、MT::Appはあまり今風とは言えない作りになっています。

MT::App::Liteを使うと、Sinatra風にアプリを作ることができます。
Sinatra風のWebアプリケーションフレームワークは各種のプログラム言語で作られていますので、それらの経験がある方なら分かりやすいと思います。

また、テンプレートエンジンとして、Text::Xslateを使います。
Text::Xslateは日本のPerl界隈では人気があるようです。

2.Perlモジュールのインストール

MT::App::Liteは、以下のPerlモジュールを利用しています。

  • Router::Simple::Sinatraish
  • Data::Section::Simple
  • Text::Xslate

そこで、cpanmコマンドでこれらのモジュールをインストールしておきます。

3.MT::App::Liteのインストール

GithubからMT::App::Liteのコードをダウンロードします。
ダウンロードしたコードの中の「lib」フォルダを、Movable Typeのインストール先ディレクトリにアップロードします。

4.アプリケーションの開発

MT::App::Liteでは、mt.psgiから起動する形でアプリを開発します。
しかし、アクセスされたアドレスと、それに対応する表示の仕方を、Sinatra風に以下のような書き方で記述します。
また、現状のMT::App::Liteでは、ビュー(テンプレート)はプログラムの中の__DATA__セクションに記述するようになっています。

HTTPメソッド アドレス => sub {
  表示の処理
};

5.例

例えば、以下のようなアプリを作るとします。

  • アプリ名を「MyLiteApp」とします。
  • 「http://your-host/path-to-mt/app/」にアクセスしたときに、IDが1番のブログから、すべての記事のタイトルを出力します。
  • 「http://your-host/path-to-mt/app/entry/記事のID」にアクセスしたときに、そのIDの記事の記事のタイトルと本文出力します。

この場合、Movable Typeのインストール先の「plugins」ディレクトリに、以下の構造でファイルを配置します。

└ MyLiteAppディレクトリ
  ├ config.yamlファイル
  └ libディレクトリ
    └ MyLiteApp.pmファイル

そして、config.yamlおよびMyLiteApp.pmに、それぞれ以下のように記述します。

config.yaml

name: MyLiteApp
id:   myliteapp
applications:
  lite_app:
    handler: MyLiteApp
    script: sub { 'app' }
    cgi_path: sub { '/' }

MyLiteApp.pm

package MyLiteApp;
use strict;

use MT::App::Lite;

setup Renderer => 'Xslate';

get '/' => sub {
  my $app = shift;
  my $blog = MT->model('blog')->load({ blog_id => 1 });
  my @entries = MT->model('entry')->load({ blog_id => 1});
  $app->render('index.tt', {
    blog => $blog,
    entries => \@entries,
  });
};

get '/entry/:id' => sub {
  my $app = shift;
  my $blog = MT->model('blog')->load({ blog_id => 1 });
  my $entry = MT->model('entry')->load($app->param('id'));
  $app->render('entry.tt', {
    blog => $blog,
    entry => $entry,
    id => $app->param('id'),
  });
};

1;

__DATA__

@@ index.tt
<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title><: $blog.name :></title>
</head>
<body>
  <ul>
  : for $entries -> $entry {
    <li><a href="<: $entry.permalink :>"><: $entry.title :></a></li>
  : }
  </ul>
</body>
</html>

@@ entry.tt
<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title><: $entry.title :> | <: $blog.name :></title>
</head>
<body>
  <h1><: $entry.title :></h1>
  <div>
    <: $entry.text | mark_raw :>
  </div>
</body>
</html>

ファイルを配置し終わったら、mt.psgiを起動し、「http://your-host/path-to-mt/app/」や「http://your-host/path-to-mt/app/entry/記事のID」にアクセスして、表示を確認します。