Actionに規制を設ける。
それぞれに役割分担を決めてやるということだ。
Webシステムは荒野に晒される仔羊だ。
おかしな要求はきっぱり拒否しなければならない。
ブラウザから送られてくる要求をチェックするActionが必要だろう。
チェックが通ればモデルの更新を行える。
モデルの更新が無事終了すれば、その結果をレスポンスする訳だ。
そんなこんなで以下の役割をActionに割り当てようと思う。
・門番
・更新
・レンダリング
ストーリーはこうだ。
・要求を受けたControllerは、まず門番Actionへブロードキャストする。
・門番Actionは配信された要求を処理して良いかどうかをチェックする。
・処理してOKならこの要求を更新Actionへブロードキャストする。
・NGなら更新Actionへはブロードキャストされない。
・最後はレンダリングActionへブロードキャストされ、出力が確定する。
となるとクラス分けが必要になる。
その前に基底クラスだ。
abstract class SimgListener {
public function getPriority() {
return 10;
}
}
getPriorityはブロードキャストの順番だ。
番号が小さい程優先順位が高い。
要は番号が小さい順にコールされる訳だ。
門番となるSimgPorterは以下。
abstract class SimgPorter extends SimgListener {
abstract public function check($event, $state, $parameter, $db);
}
更新を行うSimgActionは以下。
abstract class SimgAction extends SimgListener {
abstract public function execute($event, $state, $parameter, $db);
}
レンダリング担当のSimgRenderは以下。
abstract class SimgRender extends SimgListener {
abstract public function rendering($event, $state, $parameter, $db, $view);
}
ここまで来たらControllerの処理も書いておこう。
runは要求(Event)を受けた時に起動する関数だ。
abstract class SimgController {
protected $view; // this is Smarty Instance
// 中略
public function run($state, $parameter, $db) {
try {
$event = simg_get_array_value($_GET, SIMG_PARAM_EVENT, $this->getDefaultEvent());
$cancel = false;
foreach($this->createInstanceOnDirectoryBySort(SIMG_PATH_PORTER, 'SimgPorter') as $porter) {
if(!$porter->check($event, $state, $parameter, $db)) {
$cancel = true;
break;
}
}
if(!$cancel) {
foreach($this->createInstanceOnDirectoryBySort(SIMG_PATH_ACTION, 'SimgAction') as $action) {
$action->execute($event, $state, $parameter, $db);
}
}
foreach($this->createInstanceOnDirectoryBySort(SIMG_PATH_RENDER, 'SimgRender') as $render) {
$render->rendering($event, $state, $parameter, $db, $this->view);
}
} catch (Exception $e) {
$state->toSystemError();
$this->view->assign(SIMG_ASSIGN_ERROR, $e->getMessage());
}
if($state->isPageExist()) {
SimgLog::getInstance()->put(PEAR_LOG_DEBUG, "run display...[%s]", $state->getPage());
$this->view->display($state->getPage());
} else {
header('HTTP/1.0 404 Not Found');
print('simg Page not Found !
');
}
}
}
Controllerのストーリーが垣間見える関数だ。
詳細が見えてきた。
順調である。
ところがどうも気になるブツがあるのだ。
「状態」である。
気に入らない。
わかりにくいのである。
設計変更すべきか!