Piece Frameworkによるブログアプリケーションの作成

第2回Piece Frameworkの概要

前回の冒頭の記述にあるように、Piece Frameworkは単一のフレームワークではなく、特定の領域に焦点を合わせた独立した小さなフレームワークで構成されています。今回はPiece Frameworkを構成するそれぞれのフレームワーク、ライブラリ、その他のプロダクトについて概要を示します。

Piece Frameworkのプロダクト一覧

現在のところ、Piece Frameworkは6つのPHPプロダクトと1つのEclipseプラグインで構成されています。

プロダクト名機能要約
Piece_UnityPHPのためのステートフルでセキュアなWebアプリケーションフレームワーク
Piece_ORMPHPのためのオブジェクトリレーショナルマッピングフレームワーク
Piece_RightPHPのためのバリデーションフレームワーク
Piece_FlowWebフローエンジン及び継続サーバ
Stagehand_FSM有限状態マシン
Stagehand_TestRunnerPHPUnit2及びPHPUnitのための自動化されたテストランナー
YAML EditorEclipseのための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のインストールと動作確認に進みます。

おすすめ記事

記事・ニュース一覧