Paradigm Shift Design

ISHITOYA Kentaro's blog.

S2DaoEntityの生成

pages.scaffold周りのリファクタリング - Paradigm Shift Designの続きですが,Entityの生成について悩んでいます.


Entityの生成方法にはいくつかあって,

  1. 既存のDBのスキーマを読んで生成する
  2. "symfony"の様に,スキーマを設定ファイルで表現
  3. RoRのmigrationの様に,スキーマをスクリプトで表現

があって.どの手法をとろうかなぁと.
というか,拡張性とか何とかカンとか考えると,SQLかけよでいいんじゃないかなぁとおもう.
むしろ,DBDesignerとかのツール使ってよでいいんじゃないかと.


そこで問題になるのは,値のとる範囲だったりするんだけれども,それはページごとのPropertyにたいするアノテーションで指定でいいのかなーっておもう.
もしかしたら,設定を書いて,

<?php
class PSD_IndexPage extends Ficus_AbstractPage{
    /**
     * @Entity("Administrator")
     */
    protected $person;
}
?>

見たいにして関連付けたほうがいいのかもしれない.細かい指定がしたくなったら,PersonEntityから派生する形で,ViewerとかSubmitterとか定義して,プロパティにValidatorを定義してもいいと思う.


ん,GenerationGapな感じで,extendsしてValidator定義がいいかな.

-AutoPersonEntity      | スキーマから自動生成
 +UserEntity           | 基本となるValidatorの定義
  +AdministratorEntity | 以下UserEntityのValidatorを上書き
  +ViewerEntity        |                "
  +SubmitterEntity     |                "

みたいな.
constな値の定義はどうしようか.
現状では,id+nameな,

CREATE TABLE person_types (
  id SERIAL,
  name VARCHAR(45) NULL,
  PRIMARY KEY(id)
);

INSERT INTO person_types (id, name) VALUES (0, 'ADMINISTRATOR');
INSERT INTO person_types (id, name) VALUES (1, 'VIEWER');
INSERT INTO person_types (id, name) VALUES (2, 'BLOGGER');
INSERT INTO person_types (id, name) VALUES (3, 'SUBMITTER');
INSERT INTO person_types (id, name) VALUES (4, 'ADAGENT');
INSERT INTO person_types (id, name) VALUES (5, 'AFFILIATER');

みたいなテーブルは,

<?php
class PersonType{
  public function __construct(){
    if(self::$initialized == false){
      self::$LABEL = _("Entity_Label_PersonTypes");
      self::$REMARK = _("Entity_Remark_PersonTypes");
            
      self::$id_LABEL = _("Entity_Label_PersonTypes_id");
      self::$id_REMARK = _("Entity_Remark_PersonTypes_id");
      self::$name_LABEL = _("Entity_Label_PersonTypes_name");
      self::$name_REMARK = _("Entity_Remark_PersonTypes_name");
      self::$names["ADMINISTRATOR"]["id"] = 0;
      self::$names["ADMINISTRATOR"]["name"] = 
                         _("PersonTypes_ADMINISTRATOR");
      self::$names["VIEWER"]["id"] = 1;
      self::$names["VIEWER"]["name"] = _("PersonTypes_VIEWER");
      self::$names["BLOGGER"]["id"] = 2;
      self::$names["BLOGGER"]["name"] = _("PersonTypes_BLOGGER");
      self::$names["SUBMITTER"]["id"] = 3;
      self::$names["SUBMITTER"]["name"] = _("PersonTypes_SUBMITTER");
      self::$names["ADAGENT"]["id"] = 4;
      self::$names["ADAGENT"]["name"] = _("PersonTypes_ADAGENT");
      self::$names["AFFILIATER"]["id"] = 5;
      self::$names["AFFILIATER"]["name"] = 
                                      _("PersonTypes_AFFILIATER");
      self::$initialized = true;
    }
  }
}
?>

とかって自動生成をして,IDからnameをnameからIDを引けるようにしているんだけど,ちょっとかっこ悪い.
やっぱし,

<?php
class PersonType{
    const ADMINISTRATOR = 0;
    const VIEWER = 1;
    const BLOGGER = 2;
    const SUBMITTER = 3;
    const ADAGENT = 4;
    const AFFILIATER = 5;
}
?>

とか定義されていて

<?php
$person = new PersonType();
$persen->getText(PersonType::ADMINISTRATOR);
?>

とやるとenUSでは「Administrator」でjaJP「管理者」と出るようにしたい.でも,gettextはモジュール入れなきゃいけないし,あんまりすきくないなぁ.とはいえ設定ファイルは面倒だし,専用ツール作るのもいやだなぁ・・・


って感じです.