前回 の冒頭の記述にあるように、Piece Frameworkは単一のフレームワークではなく、特定の領域に焦点を合わせた独立した小さなフレームワークで構成されています。今回はPiece Frameworkを構成するそれぞれのフレームワーク、ライブラリ、その他のプロダクトについて概要を示します。
Piece Frameworkのプロダクト一覧
現在のところ、Piece Frameworkは6つのPHPプロダクトと1つのEclipseプラグインで構成されています。
プロダクト名 機能要約
Piece_Unity PHPのためのステートフルでセキュアなWebアプリケーションフレームワーク
Piece_ORM PHPのためのオブジェクトリレーショナルマッピングフレームワーク
Piece_Right PHPのためのバリデーションフレームワーク
Piece_Flow Webフローエンジン及び継続サーバ
Stagehand_FSM 有限状態マシン
Stagehand_TestRunner PHPUnit2及びPHPUnitのための自動化されたテストランナー
YAML Editor EclipseのためのYAMLエディター
上記のうち、Piece_Right, Piece_Flow, Stagehand_FSMはフレームワークやライブラリ開発者向けのプロダクト、それ以外はユーザ(アプリケーション開発者)向けのプロダクトとなっています。
Piece_Unity
Piece_Unity はJavaの著名フレームワークApache Struts と同様のレイヤに位置する、PHPによるWebアプリケーションの作成のためのフレームワークです。Piece_UnityはPiece Frameworkの代表的なプロダクトであり、最もユーザ(アプリケーション開発者)に近い存在といえます。この連載で登場するブログアプリケーションは直接的にはPiece_Unityと後述のPiece_ORMを使って実装されることになります。
Piece_Unityは、ステートフル、セキュア、Webフローコントロール、イベントドリブンといった他のフレームワークであまりみられない特徴を持っています。
ステートフル
Piece_Unityを使ったアプリケーションのプログラムコードは、HTTPによる状態を持たない(ステートレスな)振る舞いの制約を受けません。言い換えると、ユーザの断続的なリクエストが、アプリケーションからみた場合に状態が保持された連続的なものにみえるということです。Piece_Unityでは、このような状態が保持されていることを前提としたプログラミングが可能になります。より具体的には、アクションクラスのプロパティ値がリクエストをまたがっても保持されていることを前提としたプログラミングが可能になるということです。
セキュア
Piece_Unityアプリケーションは、不正リクエストやCSRF、セッション固定化といった問題から自動的に保護されます。よって、ユーザがこれらのセキュリティ対策を施す必要はありません。Piece_Unityはイベントドリブンなフレームワークであり、画面毎に定義されたイベント以外は受け付けることはありません。不正なイベントを検出すると、単に現在の画面が再度描写されます。また、フローの実行(=ウインドウ)には一意のID(フロー実行チケット)が振られているため、そのIDが与えられない限り、アプリケーションを継続することはできない仕組みになっています。
Webフローコントロール
Piece_Unityは、Webアプリケーション開発で必須となる、アプリケーションの画面遷移とそれに伴うイベント処理を一手に引き受けるWebフローエンジンを持っています。これは、Piece_Unityのステートフル、セキュアといった特徴を支える基盤となる部分でもあります。Piece_Unityでは、Webフローエンジンによってアプリケーションのフローが完全にコントロールされます。また、Webフローエンジンに与えられるフロー定義は、フロー定義ファイルとして切り出されています。これによって、アプリケーションフローの一覧性が増すのに加えて、画面遷移に関するプログラムコードが一切なくなるためアクションクラスの見通しがよくなります。
イベントドリブン
Piece_Unityは、Visual BasicやDelphiのようなイベントドリブンなフレームワークです。Piece_Unityのアプリケーション実行環境は、何らかのイベント(ボタンやリンクのクリック)が発生すると、それに対応する処理を実行し次のイベントの発生を待ちます。これらのイベントは、フロー定義ファイルで画面毎に定義することができます。また、必要に応じてイベントが発生したときに実行されるコールバックを定義することができます。このコールバックの実装はフロー定義ファイルと対になっているPiece_Unityのアクションクラスに配置されます。このコールバックはイベントハンドラと呼ばれています。
Piece_ORM
Piece_ORM はシンプルなオブジェクトリレーショナルマッピング(Object-Relational Mapping, ORM)フレームワークです。Piece_ORMの最大の特徴はデータベースレコードがマッピングされるオブジェクトにPHPのビルトインクラスであるstdClassを採用していることです。stdClassの採用によりモデル生成の手間がなくなり、テーブルのスキーマ変更の影響を受けずにすみます。
また、マッパー定義ファイルによってユーザが任意のメソッド名とSQLをマッピングできる、という特徴もあります。SQLを外部ファイルに切り出すことで、コードにSQLが埋め込まれることがなくなりコードの可読性が上がる、テーブルを対象としたSQLを一覧できるといったメリットもあります。さらに、SQL自体には何ら制限はありませんので複雑なSQLでも問題なく記述することができます。加えて、SQLにはPHPの変数を使うことができます。ユーザが利用できるマッパークラスは、このマッパー定義ファイルから自動的に生成されます。
マッパー定義ファイルによる任意のメソッドとSQLのマッピングの例
- name: findForAuthentication
query: SELECT * FROM person WHERE login_name = $loginName AND login_password = $loginPassword
なお、Piece_ORMのアーキテクチャにはRuby on Railsに採用されたことによって一躍有名になったActiveRecord ではなくDataMapper が採用されています。
Piece_Right
Piece_Right は汎用のバリデーションフレームワークです。YAMLベースのバリデーション定義、豊富なビルトインバリデータ、入力フィルタ、仮想フィールドやファイナルズといった多くの特徴を持ちます。Piece_UnityにはこのPiece_Rightが統合されており、より簡単に使えるようになっています。
バリデーション定義ファイルの例
- name: firstName
description: First Name
required:
message: %_description% is required
validator:
- name: Length
rule:
min: 1
max: 255
message: The length of %_description% must be less than 255 characters
...
Piece_Flow
Piece_Flow は先述のPiece_Unityのステートフル、セキュア、Webフローコントロール、イベントドリブン、といった特徴すべての基盤となる、Webフローエンジンと継続サーバを提供するフレームワークです。Piece_Flowを使うことで、ステートフルなプログラミングが可能になる、アプリケーションがセキュアになるといった恩恵を受けることができます。Piece_Flowは汎用のフレームワークであり、他のフレームワークと容易に統合することが可能です[1] 。
フロー定義ファイルの例
firstState: DisplayForm
lastState:
name: DisplayFinish
view: Finish
activity:
method: doActivityOnDisplayFinish
viewState:
- name: DisplayForm
view: Form
activity:
method: doActivityOnDisplayForm
transition:
- event: ProcessConfirmFormFromDisplayForm
nextState: ProcessConfirmForm
action:
method: doProcessConfirmFormFromDisplayForm
...
actionState:
- name: ProcessConfirmForm
transition:
- event: DisplayConfirmationFromProcessConfirmForm
nextState: DisplayConfirmation
- event: DisplayFormFromProcessConfirmForm
nextState: DisplayForm
...
Stagehand_FSM
Stagehand_FSMは有限状態マシン(Finite State Machine, FSM)[2] を提供します。複雑な状態を管理するようなアプリケーションやフレームワーク、ライブラリに導入することで、大量のswitch文やif文をコードから排除することができます。Stagehand_FSMはPiece_FlowのWebフローエンジンの基盤として使われています。
Stagehand_TestRunner
Stagehand_TestRunner はユニットテストのためのフレームワークPHPUnit のテストを自動実行するためのスクリプトを提供します。通常PHPUnitでは自動実行をするためのクラスを手作業で構築しないといけませんが、Stagehand_TestRunnerを使うことで単にテストケースを追加するだけですべてのテストを自動実行できるようになります。Stagehand_TestRunnerは現在PHPUnit2及びPHPUnitをサポートしています。
YAML Editor
YAML EditorはKwalify によるスキーマバリデーション機能を備えたYAMLエディタです。独自のスキーマファイルを使ってYAMLファイルを保存時に検証することができます。YAML EditorはEclipse のプラグインとして提供されています。
インストール方法についてはこちら を参照ください。
おわりに
以上で現在のPiece Frameworkを構成する全プロダクトを紹介しました。Piece Frameworkが多様なプロダクトで構成されていることがおわかり頂けたのではないでしょうか。Piece Frameworkのプロダクトは今後も増加する予定です。
最後に、近いうちにリリースが計画されている新規プロダクトPiece_IDEについて触れておきましょう。Piece_IDEはEclipseプラグインベースのPiece Framework用の統合開発環境です。Piece Frameworkを使ったアプリケーションのビジュアル開発を実現するべく日々開発が続けられています。最初のリリースでは、GUIによる画面遷移とイベントの定義を可能にする「フローデザイナー」と、Piece_Unityを使ったアプリケーションのディレクトリ構造とファイルを生成する「プロジェクト生成ウィザード」が含まれる予定です。こうご期待ください。
次回は、Piece Frameworkのインストールと動作確認に進みます。