Piece Frameworkのプロダクトの一つ、Piece_Unityの1.6.x系を利用して、ステートフルなWebアプリケーションを開発する場合、「エントリポイント」と呼ばれるファイルをフローの種類の数だけ用意するのが一般的だと思います。
そして、各エントリポイントへのurlが、どのフローと結びつくのかを、Dispacher_ContinuationプラグインのflowMappingsという設定ポイントで指定することになります。
- name: Dispatcher_Continuation
point:
- name: useFlowMappings
type: configuration
value: true
- name: flowMappings
type: configuration
value:
- url: /approot/crud/list.php
flowName: Examples_CRUD_List
isExclusive: false
- url: /approot/crud/manage.php
flowName: Examples_CRUD_Manage
isExclusive: false
- url: /approot/regist.php
flowName: Examples_CRUD_Regist
isExclusive: false
例えば上記の例では、http://hostname/approot/crud/ の直下に それぞれ、 list.php, manage.php. regist.php という三つのPHPファイルを設置する必要があります。
これを、Apacheのmod_rewriteモジュールを利用して、一つのPHPファイルのみで済ませる方法を考えてみました。
参考にしたのはCakePHPのapp/webroot フォルダ内の.htaccess ファイルの記述です。
まず、アプリケーションのルートとなるディレクトリ(ここではapproot)に、次のような記述をした.htaccessファイルを配置します。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /approot
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ continuation.php?url=$1 [QSA,L]
</IfModule>
これで、リクエストされたファイルが存在しない(ファイルでもディレクトリでもない)場合、GETパラメータが付与された状態でcontinuation.phpが呼ばれることになります。
次にそのcontinuation.phpを同じ階層に配置します。このファイルには次のような記述を行います。
これによってエントリポイントを複数設定する手間を省くことができるのではないでしょうか。
※追記
Piece_Unity 1.7.0以降、URLマッピングに利用される変数が、$_SERVER['SCRIPT_NAME']ではなく$_SERVER['REQUEST_URI'] に変更されました。(リリースノート)
このため、この記事に記載したコードは、1.7.0以降のバージョンでは利用できません。
この変更により、この記事よりも、圧倒的にシンプルな記述によって、同様の効果を得られるようになりました。
1.7.0以降のバージョンのためのコードは、別の記事にアップする予定です。
