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とは言えないのではないか…。