2010-11-19 26 views
2

Etki Alanı Modellerini uygulamanın farklı bölümlerinde nasıl yeniden kullanacağımı anlamaya çalışıyorum ve Veri Eşleyici şablonunun ileriye doğru yol aldığını hissediyorum. Aşağıdaki örnekte, Eşleştirmenin yöntemlerine doğrudan erişen yöntemler vardır. Etki Alanı Nesnesi birden çok Veri Eşleştiricisi gerekiyor

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; 
    } 
} 

... Ve bir haritacı Grupları sınıfına yöntemlerini eşleşecek. bir süre sonra aynı Gruplar Modelleri kullanmak ancak farklı sorguları kullanarak grupları eklemek istiyorsa

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 
    } 
} 

Ancak ben farklı eşleştiricisini kullanmak. Şimdi

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; 
    { 
} 

Ben amacı Sıska Denetleyicisi'dir bilin - Yağ Modeli, bu yüzden Modeli (tabiri caizse) Mapper Harita üzere başka bir model olurdu?

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); 
    { 
} 

cevap

4

Veri Modeli, Veri Eşleyici hakkında bilgi sahibi olmamalıdır. Gruplarınızdaki sınıf/model, yöntemleri bulmamalı ve eşleştiriciye erişmemelidir.

Mapper bağımlılığını modelinizden kaldırdıktan sonra sorunlarınız gider.

NOT: rojoca sen/getirme modele doğrudan yöntemler bulmak zorunda olmamalı diyor Doctrine 2

+0

"Gruplar", "Grup" nesnelerini içeren bir koleksiyon ise ve bunlar bağımlı haritalama gerektiren modellerdir. Onları Gruplardan ayırmanız, bir Eşleştiricisi'nden geçirmeniz ve sonra bunları yeniden koleksiyona eklemeniz gerekir mi? Bu, İstemci/Denetleyici'nin Mappers hakkında bilgi sahibi olması anlamına mı geliyor? – gawpertron

+0

'FatModel'inize bir Depo adı verilir. Burada iyi bir açıklama var: http://msdn.microsoft.com/en-us/magazine/dd569757.aspx#id0400058 – rojoca

+0

Neden yapardınız? İhtiyaçlarınıza göre tasarlayın. Repo'yu önbellek olarak kullanmazdım. Önbelleği veri eşleştiricisine yerleştirin. – rojoca

0

göz atın. Teknik olarak, aynı zamanda, haritacıya bir referansı saklamayan model hakkında da haklıyız, ancak daha az karmaşık durumlarda, modelin, sahip olduğunuz en ayrıntılı haritacıyı (örneğin, bir çeşit taban eşleyicisi) sadece tararken, bu durumun iyi olduğunu düşünüyorum. sınıf veya bir arayüz).

Her şeyden önce, haritacıya yalnızca yöntem eklemeniz gerekir, bunun için sadece miras kullanırım, yani. Yeni işlevsellik için grup eşleştiricinizi genişletin. Tabii ki, bu haritacı modele enjekte edilebilir. Ama eğer modeliniz haritanıza bir referans gösterecekse, o zaman her nasılsa enjekte edilebilir.

+0

İlk denemelerimde, mapper'e bir referans ekledim ve bunu yapmanın sınırlamalarına erken başladım. Yine de, haritacıların Model veya Denetleyici olmadan bir yerlerde onları nasıl kullanacaklarını nasıl resmediyorum? – gawpertron

+0

Denetleyicileriniz doğrudan denetleyicileri uygulama/modüle özgü olduğundan, denetleyicilerinizde yanlış bir şey olduğunu düşünmüyorum. – prodigitalson

+0

Bir Mapper'ın başka bir Mapper hakkında bilgisi olabilir mi? – gawpertron

İlgili konular