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のストーリーが垣間見える関数だ。
詳細が見えてきた。
順調である。
ところがどうも気になるブツがあるのだ。
「状態」である。
気に入らない。
わかりにくいのである。
設計変更すべきか!