2010-11-19 16 views
2

Örneğin:Etki alanı nesneleri diğer veri eşleyicilerini arayabilir mi? (Zend Framework)

10 Widget içeren bir Kullanıcı var. Bununla birlikte bu widget'ların 5'ini yöneten bir yöneticim var.

Belirtilen bir Yönetici tarafından yönetilen Kullanıcı Widget'larını almak istiyorum. Bu yüzden WidgetMapper adlı bir fonksiyon yarattım ve bu 5 widget için db'yi sorgulayan ve bir dizi Widget nesnesi olan fetchUsersManagedWidgets ($ userId, $ managerId).

Etki alanı nesnelerini, eşleştiricilerinden haberdar etmemeleri gerektiğini biliyorum, ancak Kullanıcı modelinde WidgetMapper işlevini çağıran bir işlev oluşturabilir miyim?

örn.

class Application_Model_User { 

    public function getWidgetsManagedBy($manager) { 
     $widgetMapper = new Application_Model_WidgetMapper; 
     return $widgetMapper->fetchUsersManagedWidgets($this->getId(), $manager->getId()); 
    } 

} 

Veya bu tek yönlü bir cadde midir ve etki alanı nesneleri asla mapper işlevlerini çağırmamalıdır?

cevap

1

Genel olarak desen, ortak bir sorunu nasıl çözebileceğinizi açıklayan bir fikirdir. Onların "böyle yapmak zorunda" ya da "her şey kötü" değildir. Aslında, kasıtlı modelleri takip etmeyen bir karar için bile a name vardır.
Gördüğüm kişilerden, "bir db-tablosu bir alan, yani her db-tablonun bir modele ve bir mapper'e ihtiyaç duyduğunu" düşündüklerini düşünüyorum. Sizin durumunuzda üç tabloya sahip olduğunuzu varsayalım: Kullanıcılar, widget'lar ve bu ikisi arasındaki n: m ilişkisini gösteren tablo (ben buna userwidgets diyorum).
Kullanıcı arabirimleri, gerçekten kullanıcı modelinin bir parçasıdır ve kendi model/mapper'ına sahip değildir ve , widget modelinin bölümünün bir parçası değildir. Bu widget'ları usermodel'de çözmek için tanımladığınız soruna neden olan widget eşleştiricisine ihtiyacınız var.
vardır muhtemelen çok i basitçe overwritable olan varsayılan-mapper'ın üstlenecek bu sorunu çözmek için yollar en:

durumda
Class UserModel 
{ 
    $_widgetMapper = null; 

    public function getWidgetMapper() 
    { 
     if(null === $this->_widgetMapper) 
     { 
      $this->setWidgetMapper(new DefaultWidgetMapper()); 
     } 
     return $this->_widgetMapper(); 
    } 

    public function setWidgetMapper($mapper) 
    { 
     // todo: make sure it's a mapper of the correct type 
     $this->_widgetMapper = $mapper; 
    } 
} 

Eğer sadece önce belirlesin varsayılan widget'dır-mapper'ın kullanmak istemiyorum Kullanıcının widget'larına erişim (talep üzerine yüklenmelidir).

+0

Haklısınız n: m ilişkisi olan bir UserWidgets tablosum var. Bu beni takip eden bir soruya getiriyor. Eğer userwidgets kendi model/mapper'ına sahip değilse, ilişkiyi db'ye kaydetmek için hangi mapper'ı kullanırım? UserMapper işlevinde saveUserWidgets ($ user, $ widgets) denilen bir işlev bu doğru olduğunu söylemek cazip mi? – Craig

+0

@craig: Evet, öncelikle UserMapper'a ekleyebilirim. WidgetMapper pov 'dan bir addUser fonksiyonu ($ widget, $ user) olurdum. Her ikisi de yapılabilir, her ikisi de doğru, her ikisi de yararlı olabilir. Ne yaptığınıza bağlı olarak saveUserWidgets'la (veya addwidget ($ User, $ widget) ve removeWidget (...) gibi) atom bile oluşturabilirim. Ne yaptığını bildiğiniz sürece her işleve izin verilir;) Eşleştirici için "yasak" veya "sahip olması gereken işlevler" yoktur. – Fge