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

Modelを考える。
…。
とは言っても、Modelって何だろう?
Webシステムでは大概、DBを使う訳で、これが普通はRelationalなので、プログラミングで扱いやすい形式、例えば構造体なんかに変換している。
所謂、ORマッピングだ。
ところがである。
PHPなどは構造体とハッシュが等価であり、わざわざ構造体など定義する必要はないのである。
例えば個人情報を扱うUserクラスは、

class User {
  $id;
  $name;
  $email;
}

などと構造体宣言しなくても、

array(
  'id' => -1,
  'name' => 'syscon',
  'email' => 'syscon@syscon.com'
);

でOKなのだ。
これは便利である。
我々はpojoからも解放されたのだ。
DBMSでスキーマを作っておけば、PDOがきちっとハッシュを作ってくれる。
(あ、今回はPDO(PHP Data Objects)を使います。)
なんだ、Modelなんていらないじゃないか。
よし、終了!

いや、まてよ、何か忘れている…。
Parameterだ!
Webシステムでは常套のGETやPOSTで送られてくる奴である。
$_REQUESTを使えば良いのだが、そこはOOPに洗脳された頭脳である。
共通変数に常時アクセスするのは大変な苦痛を伴う。
カプセル化しよう。
ついでに$_COOKIEと$_SESSIONも道連れにする。

abstract class SimgParameter {
  public function getRequest($key) {
    return simg_get_array_value($_REQUEST, $key, null);
  }
  public function getCookie($key) {
    return simg_get_array_value($_COOKIE, $key, null);
  }
  public function getSession($key) {
    if(!$this->isSessionStarted())
      return null;
    return simg_get_array_value($_SESSION, $key, null);
  }
  public function isSessionStarted() {
    return isset($_SESSION);
  }
  public function get($key) {
    $v = $this->getRequest($key);
    if(is_null($v)) {
      $v = $this->getCookie($key);
      if(is_null($v)) {
        $v = $this->getSession($key);
      }
    }
    return $v;
  }
}

ちなみにsimg_get_array_valueはヘルパー関数だ。

function simg_get_array_value($ary, $key, $def) {
  $ret = $def;
  if(isset($ary[$key])) {
    $ret = $ary[$key];
  }
  return $ret;
}

こんなものだろうか。
でもModelがParameterだけ、というのは「Simple is grate」とは言え、あまりにも親切心に欠けるのではないか。
せめてPDOを初期化するくらいの機能は提供しておいた方が良いだろう。

abstract class SimgDb {
  public function __construct() {
    $this->initialize();
  }
  private function initialize() {
    $this->db = $this->createDb();
  }
  protected function getTableConfigPath() {
    return simg_combine_path(SIMG_PATH_CONFIG, SIMG_FN_CONFIG_TABLE);
  }
  protected function createDb() {
    $db = null;
    $ini = parse_ini_file($this->getDbConfigPath());
    if(!is_null($ini)) {
      try {
        $db = new PDO($ini[SIMG_ENTRY_DB_DSN], $ini[SIMG_ENTRY_DB_USER], $ini[SIMG_ENTRY_DB_PASSWORD]);
      } catch (PDOException $e) {
        throw new SimgException('PDO create error.', __FILE__, __LINE__);
      }
    }
    return $db;
  }
}

DBを生成すればコネクションを張ってくれる。
Webシステムとしてはこれで十分だろう。

さて、DBとParameterが揃って、Modelも何となく形ができたような気分にはなった。
ActionはEventを受け取り、DBとParameterに対して何らかの処理を行う、というストーリーは見えた。
でも何か一本筋が通っていない。
Frameworkユーザーに対する道しるべが見当たらないのだ。
これではFrameworkとは言えないのではないか…。

コメントを残す

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