フレームワークの役割と構築方法についての解説は、今回で最後となります。
リクエストハンドラはその名の通りリクエストを扱います。このフレームワークでは、次のようなことをします。
- URLからModule とactionを取り出す
- 要求されたModuleのインスタンスを作る
- ユーザのアクションをチェックする
- モジュールのアクションテンプレートを読み込む
- 要求されたModuleへリクエストを送信する
表2:リクエストハンドラで行うこと
リクエストハンドラはリクエストを受け取ると、それが正しいものかチェックして要求されたモジュールに送ります。どのような振る舞いをするかは、ユーザがリクエストを送ったModuleによります。リスト5を見てください。
リスト5
<?php
⁄**
*
*
* @author Darryl Patterson < darryl.patterson@eurorscg.com >
* @copyright Euro RSCG 4D
*
*⁄
include_once('common/util/class-EnvironmentFactory.php');
include_once('common/util/class-ModuleFactory.php');
require_once('common/util/class-Config.php');
class Handler {
var $config;
var $env;
function Handler()
{
$this->config = Config::instance();
$envFactory = new EnvironmentFactory(
$this->config->getEnvironmentClassName());
$this->env = $envFactory->createInstance();
}
function getHandledRequest($request)
{
if (isset($_SERVER['PATH_INFO']) &&
$_SERVER['PATH_INFO'] != '/'){
$pathSplit = explode('/',
substr($_SERVER['PATH_INFO'], 1));
if (isset($pathSplit[0])){
$request['M'] = ucfirst($pathSplit[0]);
}
if (isset($pathSplit[1])){
$request['action'] = $pathSplit[1];
}
}
// モジュールが選択されていない時はデフォルトモジュールを設定
if (!isset($request['M'])){
$request['M'] = $this->config->defaultModule;
}
$factory = new ModuleFactory($request['M']);
$module = $factory->createInstance();
if (!$module->authenticateAction()){
$redirect = '/'.$this->config->frontController;
if (isset($request['M'])){
$redirect .= '/' . $request['M'];
}
if (isset($request['action'])){
$redirect .= '/' . $request['action'];
}
if (isset($_SERVER['QUERY_STRING']) &&
$_SERVER['QUERY_STRING'] != ''){
$redirect .= '?' .
$_SERVER['QUERY_STRING']; }
$this->env->session->setValue('loginRedirect',
$redirect);
header('Location: ' .
$this->config->failedAuthenticationRedirect);
exit(0);
}
if (!isset($request['action'])){
$request['action'] = $module->defaultAction;
}
$module->loadTemplate($request['action']);
return $module->getHandledRequest();
}
}
?>
getHandledRequest()関数の最初の部分を見ると、Moduleの名前とURLからアクションを決めていることがわかると思います。フロントコントローラには拡張子がないことを思い出してください。下のURLを見ると、フロントコントローラ(app)の後ろにデータがついていることがわかります。
スラッシュではじまるデータが使えるのは、PHP_INFOでそのように設定しているからです。
フロントコントローラの一例
http://www.example.com/app/Default/login
この場合、モジュールはDefaultで、アクションがloginになります。このURL全体を見ると、このリクエストは/app/Default/loginディレクトリのディレクトリインデックスにアクセスしているように見えます。
アプリケーションで必要な追加データは、普通のクエリ文字列データかフォームのPOSTデータとして送られることに注意してください。
|