2012-05-07 11 views
0

私は、アプリケーションのオンラインステータスに応じて、mysql dbまたはxmlファイルにデータを書き込む必要があるWebアプリケーションを構築しています。私のモデルではPHP + MVC - 私のドメインモデルが混乱しています

、私は(ダオは、データアクセスオブジェクトである)のスーパークラスを持っている...今

abstract class Dao { 

    static function getInstance($online_status) { 

     if $online_status = 'online' { 

      return new DaoMySQL; 

     } else { 

      return new DaoXML; 

     } 

    } 

    abstract function dao_select(); 
    abstract function dao_insert(); 
    abstract function dao_update(); 
    abstract function dao_delete(); 

} 

、ここで私はおよそ混乱している部分があります。私は適切なDaoを選択するドメインモデル/エンティティクラスを持っています:

$this->dao = Dao::getInstance($online_status); 

これで正しいデータアクセスオブジェクトが選択されました。しかし、問題はまだdao_select()と他の関数の2つの実装です。現在、主な実装はそれぞれのクラスDaoMySQLとDaoXMLにありますが、それぞれのクラスのdao_select()には異なるものが必要です。つまり、DaoMySQLバージョンには$ tableと$ where_statementの2つのパラメータが必要です。私が実装していないDaoXMLには要素名が必要になります。おそらくもう一つの議論ではありません。

だから、私のドメインモデルクラスで、

$this->dao = Dao::getInstance($online_status); 

を呼び出した後、私はdao_select(の(ドメインモデル/エンティティクラスのみに関連する)二つの別々のローカル実装を含める必要があるところ、この)、またはこれは、違う?このアプローチは理にかなっています...私はシステムの外にシンプルさを取っているように私は感じ

class EntityModel { 

    $this->dao = Dao::getInstance($online_status); 

    if($this->dao->type = 'mysql') { 

    $result = $this->dao->dao_select($table, $where); 

    } else { 

    $result = $this->dao->dao_select($xml_params); 

    } 


} 

、または:ちょうど私がプロセスのうちの優雅さを取っているように、このような何かを行うことによって思えますそこには良いものがありますか?

答えて

0

あなたは間違っています。そもそも

ほとんどのノート:OOPで

  • extends文がを意味関係です。つまり、class Duck extends Birdはすべて罰金ですが、class User extends Tableと書いてありません。です。
  • MVCでは、モデルはクラスまたはクラスのインスタンスではありません。
    1. ドメインオブジェクト:を含むドメインのビジネスルールとロジック
    2. データアクセス構造:代わりに、大部分の元素の二種類からなるアプリケーションの層であり、通常datamapper情報の記憶および検索を扱うは

私はargueとします。モデルレイヤの3番目の重要な部分はサービスです。しかし、それがモデルの一部であるかそれ以上であるかについての選択肢があります。

現在のところ、ActiveRecordを強制することです(小さなものは問題ありませんが、プロジェクトが成長するとアーキテクチャの負担になります)。ダイナミックで動作するパターンデータソース。これを行うには、手続き呼び出しに頼っています。

とにかく、DAOインスタンスをドメインオブジェクト(「モデル」と呼ぶ)に注入する必要があります。また、DAOの作成は別のファクトリインスタンスに任せておく必要があります。ファクトリインスタンスを初期化し、データソース(PDOまたはファイルパスのインスタンス)を提供する必要があります。こうすることで、責任を分けるだけでなく、保存先を「オン・フライ」でスワップすることができます。

詳しくは、dependency injectionを調べてください。応答のための

+0

おかげで、私はあなたの答えについて困惑している:ここに役立つかもしれないいくつかのビデオです。私のモデルはクラスを組み込んでいますが、単一のクラスではありません。上記のDaoクラスは、モデルレイヤの単なるコンポーネントです。私はまた、アプリ内のすべての主要プレーヤー(つまり、いくつかのdbテーブルから情報を引き出し、それらを単一のオブジェクトにマップする伝記的クラス)の属性とメソッドを統合するドメインオブジェクトを持っています。私はActive Recordについてあなたの意見を見ていますが、私はそれを実装しているとは思わないのです。私は上記のあなたの例のようにクラスにDBテーブルをラップしていません。 – fromabove

関連する問題