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ですね。