イベント駆動型PHPフレームワークを作る その12

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です