Simgの中枢SimgControllerのrunです。
public function run($output, $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, $output, $parameter, $db)) { $cancel = true; break; } } if(!$cancel) { foreach($this->createInstanceOnDirectoryBySort(SIMG_PATH_ACTION, 'SimgAction') as $action) { $action->execute($event, $output, $parameter, $db); } foreach($this->createInstanceOnDirectoryBySort(SIMG_PATH_PAGER, 'SimgPager') as $pager) { $pager->paging($event, $output, $parameter, $db); } } foreach($this->createInstanceOnDirectoryBySort(SIMG_PATH_RENDER, 'SimgRender') as $render) { $render->rendering($event, $output, $parameter, $db); } } catch (Exception $e) { $output->error($e); } if(!$output->display()) { header('HTTP/1.0 404 Not Found'); print('<html><head><title>simg</title></head><body><p>Page not Found !</p></body></html>'); } }
規定の場所に配備されたクラスを使ってインスタンスを生成し、それぞれの役割のタイミングでコールしています。
porterに配備されるクラスでは受信したEventを処理できるかどうか検査します。
検査を通過した場合はActionとPagerに処理を渡します。
検査が通らなかった場合はActionとPagerは呼ばれません。
通常はActionでDBの更新を行いますから、適当でないEventはActionに渡さないようにすることで、システムの保全を実現できます。
無事Actionが更新処理を終えたら、PagerでどのようなResponseを行うかを決定します。
page.iniで定義してあるテンプレートのうち、どれを使うかを決める、ということです。
[template:partial] HELLO=hello.tpl: BASE, CONTENTS ERROR=error.tpl: BASE, ERROR
テンプレートが決まると、これを構成するPartialが決まります。
renderではこのPartialに適応する処理を行います。
Simg版「Hello,World」ではBaseRenderが「PARTIAL_BASE」を処理しています。
class BaseRender extends SimgRender { public function rendering($event, $output, $parameter, $db) { if($output->hasPartial(PARTIAL_BASE)) { $v = simg_get_value($parameter->get(SIMG_PARAM_LANGUAGE), 'ini'); switch ($v) { case 'ini': $lang = 'ja'; break; default: $lang = $v; } $output->assign(SMARTY_LANGUEGE, $lang); } } }
hasPartialは現在指定されているTemplateが引数のPartialで構成されているかどうかを調べます。
どうやらhtmlのlang属性を決定しているようですね。
このような流れで確定したResponseをoutputインスタンスのdisplay関数が出力します。
Simgの大雑把な流れは以上です。
流石「Simple is great!」だけあって、内容もSimpleですね。