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