前回の冒頭の記述にあるように,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が採用されています。

