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

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のストーリーが垣間見える関数だ。

詳細が見えてきた。
順調である。
ところがどうも気になるブツがあるのだ。
「状態」である。
気に入らない。
わかりにくいのである。

設計変更すべきか!

コメントを残す

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