DSC04367

PHP5.3以降専用の軽量フレームワークLithiumの誕生の経緯について以前、紹介しました。Lithiumは軽量さ、拡張性を追及するという事でCakePHPとはまた違った理想の元に開発されているフレームワークです。実際にLithiumを使った開発の流れをベルリンであった事のあるジョン(写真左)がエントリを書いていたので今回はこの記事を紹介しようと思います。ケーススタディはOSSのチャットサービスAnalogueとして実装されていてバックエンドはCouchDBを採用しています。

ジョンはベルリンで会った中でも最高に親切で英語のおぼつかない僕やcakephperさんに「荷物を置きにホテルに戻るけど来る?」とか「パーティの場所はわかる?」とかいろいろと気にかけてくれました。そんなジョンが書いた記事という事でちょっと気合が入るところです。気さくなジョンがフレンドリーに語りかけてくるイメージでお読みください。

なお本文の各セクションは実際のコードを見ながら読むと分かりやすいのでセクションごとにリンクが設けてあります。

原文 "Rapidly developing an application with Lithium: a case study"
http://rad-dev.org/lithium/wiki/blog/rad-dev-a-case-study

Lithiumによる高速アプリケーション開発のケーススタディ

この記事はPHPフレームワークの中でもっとも先鋭的なLithiumを使って開発を行った際の流れを振り返ってまとめよう。この記事を書いている時点でLithiumはまだ初期の開発段階で、本番利用は推奨されない。だが、そのシンプルさの働きでアプリケーションとフレームワークを効率的かつ簡単に繋げる事ができた。この実験の中で僕はオープンソースアプリケーション「Anologue」をすばやく開発し、サービスを立ち上げ、仲間の開発者と協力する事ができた。

書く前の考え

何かを書き始める前にそのアプリケーションの目的について考えるのは大事なことだ。達成の為に絶対に必要な事にフォーカスした明確なゴールを定義する必要があった。すばやく動くためには全ての側面でシンプルである事が重要だ。そこで僕はリファクタリングと実験にフォーカスする事にした。

僕の初期のゴール: どんな人数の人にもチャットルームのようなWEBページを見せられるようにする。リンクを生成し誰にでも参加した会話をシェアする。名前とテキストを入力して会話に追加する。

データベース

この段階で僕のアプリケーションのデータをどうやって集めて取り出すか、どのデータベースを使うのかを考えた。PastiumはうれしいことにCouchDBで動いているが僕の経験は限定的だ。ここはひとつ最初からやってみるいい機会に思えた。

なぜなら僕はユーザーやカテゴリなどのリレーショナルな要素を実装する予定は無かったし、ドキュメント志向のCouchDBは正に僕が求めていたものだった。さらにコレクション(またはテーブル)の中のドキュメントはスキーマを共有する必要が無いので、モデルを通じてデータの保存や呼び出しをすれば、簡単にドキュメントを追加したり、削除したり修正できる。基本的にCouchDBに対して僕がやったのはコレクションを作っただけで、それからは何も見直していない。残りは全てPHPだ。歓喜の涙でモニタが見えず、プログラミングを続けられないくらいだった。

モデル

実際のコード
僕はモデルのデータをベーシックな配列で統一する事にした。(訳注:Lithiumはモデルのデータ構造を配列とオブジェクトで任意に選択可能)それぞれ自身の内容を含み、さらに便利な幾つかの他の情報も含む。(これは僕がやっておいた)機能的には新しいドキュメントの作成、IDで指定されたドキュメントの読み取り、配列に含まれるメッセージでのドキュメントの更新が必要だった。またCouchDBはHTTPプロトコル上で動作するのでメッセージを保存する前にURLエンコードする必要があった。またメッセージを読み取る際にはURLでコードも必要になる。以上が基本の内容です。(編者注:これらのほとんどの処理は公式のCouchDBアダプタが自動で行うよう現在ではなっている)

コントローラー

実際のコード
モデルのようにコントローラーにも3つのシンプルなアクションが必要になる。新しいモデルの作成、モデルの読み取り、存在するモデルへのメッセージの追加だ。どれも非常に素直に進める事ができる。

僕のLithiumの好きな面の一つにコントローラーから直接JSONのデータをダンプできる事がある。これはとてもシンプルなアイデアでコードもシンプルになる。

$this->render(array('json' => $data));

またスタティックなオブジェクトを使ってコントローラー内でモデルを動かすのも論理的だ。そうなのかどうかは実際に見ておいてほしい。

コードを見ると$statusという変数があちこちにばら撒かれているのに気がつくと思う。これはAJAXを使ってJSONのデータを受け取る時にJSend仕様を確認する為に入れている。仕様はかなりシンプルで色々な方法があるのかはわからないけれど、無難なレスポンスのフォーマットを統一する方法としては理にかなっているだろう。もしこの仕様を見つけられないのであれば、この方法を見てほしい。

ビュー

実際のコード
次にビューについて述べよう。このアプリケーションではビューは一つしか必要ではない。(このアプリケーション内の他のビューはただのページで、これは1つのコントローラに貼りつけてしまおう)

このViewビューはメッセージを送信する為の入力フォームを表示する。また存在するメッセージをループしてHTMLのフォーマットにする。またそのあとにanologueのidを共有する為のURLををショートカットする処理を追加した。

javascript

実際のコード
残りの部分はLithiumには関係がない。ただ他の部分とどのように合わせるかやあなたのアプリケーションの開発の為にインスピレーションを与える事はできるだろう。まとめていく中でrad-devのサイトに載せる時にひっかかった所がある。cli-naviの部分だ。僕らは基本的にページが読み込まれた時にオブジェジェクトを作り、いくつかの要素にイベントがアタッチされた時にアプリケーション固有のメソッドを提供していた。この場合だと新しいメッセージの送信、新着メッセージのポーリング、新しいメッセージの生成とHTMLの追加だ。

ボーナスラウンド

Showdownを使ってMarkdownをサポートしたらいいのではないか?思うにテクニカルなユーザがコードの共有をしたり、マニアなブロガーがテキストをスタイリングするのに有用だ。またちょっとした自己主張をしたい時にgravatarを使えるようにEメールのフィールドを追加した。最後にHTML5のaudio elementとブラウザの互換に対応する為の少しのJSもどうだろう?あなたの名前を含むメッセージが登録された時はサウンドエフェクトが鳴る。うん、何?

あきれたことにこんな小さいアプリケーションなのに僕はテストをまだ書いていない。またサードパーティによるさまざまな画像やメディアのサポートのアイデアもある。(imgur, drop.io)MongoDBへの移行や「閲覧中のユーザ」のような実験もだ。もし君がLithiumでアプリケーションを作るのにどこからスタートすればいいかわからないなら、Anologueへのコントリビュートを待ってるよ。

じゃあ、またラボでね!
~ Jon ~
- 翻訳ここまで

コードの雰囲気���CakePHPに似ていますが過激なくらい先鋭的なLithiumの雰囲気がわかる記事ではないでしょうか。また彼らは自分たちを科学者めいて呼ぶのが気に入っているようです。イベントをやる際は白衣か放射線防御服でも着るんですかねー。