2010-11-19 1 views
2

ドメインモデルをアプリケーションのさまざまな部分で再利用する方法を理解しようとしていますが、データマッパーパターンが進歩していると感じています。以下の例には、Mapperのメソッドに直接アクセスするメソッドがあります。複数のデータマッパーを必要とするドメインオブジェクト

class Groups 
{ 
    protected $_groups = array(); 

    public function addGroup($name) 
    { 
     $this->_groups[] = $name; 
    } 

    public function doSomethingGroupy($cakes) 
    { 
     // get all the groups that have cake 
     return $cakeyGroups; 
    } 
} 

...そして、グループクラスのメソッドと一致するマッパー。

class GroupMapper 
{ 
    public function find($id, Groups $group) 
    { 
     // Mappy type things, maybe some sql 
    } 

    public function fetchByNeediness($cuddles, Groups $group) 
    { 
     // More mappy type things 
    } 

    public function save(Groups $groups) 
    { 
     // Saves 
    } 
} 

しかし、いつか後、私は、同じグループのモデルを使用しますが、私は別のマッパーを使用する別のクエリを使用してグループを移入したい場合。今

class AngryGroupMapper 
{ 
    public function find($id, Groups $group) 
    { 
     // Something similar but with other tables and joins 
    } 

    public function fetchByRage($anger, Groups $group) 
    { 
     // Something new but only needed here 
    } 

    public function isEditable(Groups $groups) 
    { 
     // Do some querying 
     return $bool; 
    { 
} 

私は目的がスキニーコントローラである知っている - 脂肪モデル、ので、私はモデルに(いわば)マッパーをマッピングするために別のモデルを持っているでしょうか?

class FatModelRepository 
{ 
    public function getHappyGroups() 
    { 
     $mapper = new GroupMapper(); 
     return $mapper->fetchByNeediness('Puffy Shoes', new Groups()); 
    } 

    public function getSadGroups() 
    { 
     $mapper = new AngryGroupMapper(); 
     return $mapper->fetchByRage('Aghh!', new Groups()); 
    { 

    public function save(Groups $groups) 
    { 
     $mapper = new GroupMapper(); 
     return $mapper->save($groups); 
    { 
} 

答えて

4

データモデルには、データマッパーに関する知識がありません。あなたのGroupsクラス/モデルはfindメソッドを持つべきではなく、マッパーにアクセスするべきではありません。

モデルからマッパー依存関係を削除すると、問題はなくなります。

注:rojocaはあなたがモデル上で直接見つける/フェッチメソッドを持っているはずの言うようにDoctrine 2

+0

「グループ」が「グループ」オブジェクトを含むコレクションであり、モデル自体が依存マッピングを必要とする場合はどうなりますか。あなたはグループからそれらを切り離し、Mapperを通してそれらを渡してから、それらをコレクションに再接続する必要がありますか?それはクライアント/コントローラがマッパーの知識を必要とするのだろうか? – gawpertron

+0

あなたの 'FatModel'はリポジトリと呼ばれます。ここでその良い説明があります:http://msdn.microsoft.com/en-us/magazine/dd569757.aspx#id0400058 – rojoca

+0

なぜでしょうか?お客様のニーズに合わせて設計してください。私はキャッシュとしてレポを使用しません。キャッシュをデータマッパーに置きます。 – rojoca

0

をチェックしてください。技術的には、マッパーへの参照を格納していないモデルについても技術的にはうまくいきますが、それほど複雑でない状況では、モデルがもっとも抽象的な形式のマッパーを使用している限り、これは大丈夫です(つまり、ある種のベースマッパークラスまたはインタフェース)。

物事を考えれば、マッパーにメソッドを追加するだけでよく、このためには継承を使用するだけです。グループ機能を拡張して新しい機能を追加します。もちろんこれは、マッパーがモデルに注入可能であることを必要とする。しかし、もしあなたがモデルにそのマッパーへの参照を保持させるつもりなら、それはどんな形でも注入可能である必要があります。

+0

私の最初の試みでは、マッパーへのリファレンスを追加しました。しかし、モデルやコントローラを使わずにマッパーを使用する方法を理解することはできません。 – gawpertron

+0

コントローラーがアプリケーション/モジュール固有のものであるため、マッパーを直接使用してコントローラーに問題があると思われます。 – prodigitalson

+0

マッパーは別のマッパーの知識を持っていますか? – gawpertron