PHP OOP: Alan Modeli Pattern Singleton / Statik Yöntemleri kaçının

1 Cevap php

Ben Dependency Injection önemini ve neden aşağıdaki sorun beni duraksatıyordur Unit test, rolünü anlamak:

Ben Singleton kullanmak için değil mücadele Bir alan Çalışma desen Kimlik Haritası / Birimi (Domain Object durumuna sekmeleri tutar Hangi) 'dir.

//Not actual code, but it should demonstrate the point    

class Monitor{//singleton construction omitted for brevity
    static $members = array();//keeps record of all objects
    static $dirty = array();//keeps record of all modified objects
    static $clean = array();//keeps record of all clean objects
}

class Mapper{//queries database, maps values to object fields
    public function find($id){
        if(isset(Monitor::members[$id]){
        return Monitor::members[$id];
    }
    $values = $this->selectStmt($id);
    //field mapping process omitted for brevity
    $Object = new Object($values);
    Monitor::new[$id]=$Object
    return $Object;
}

$User = $UserMapper->find(1);//domain object is registered in Id Map
$User->changePropertyX();//object is marked "dirty" in UoW

// at this point, I can save by passing the Domain Object back to the Mapper
$UserMapper->save($User);//object is marked clean in UoW

//but a nicer API would be something like this
$User->save();

//but if I want to do this - it has to make a call to the mapper/db somehow    
$User->getBlogPosts();

//or else have to generate specific collection/object graphing methods in the mapper
$UserPosts = $UserMapper->getBlogPosts();
$User->setPosts($UserPosts);

Bu durumun üstesinden nasıl herhangi bir tavsiye?

DI karşılamak için kendini Nesne Etki içine mapper / veritabanı erişimi örneklerini oluşturmak / geçmek nefret olurdu - kaçınarak, aynı zamanda, dış statik yöntemlere Domain Nesne içindeki çağrı sürü sonuçları.

Ben onun davranışının bir parçası olmak için "kaydet" istiyorsanız, o bunu yapmak için bir tesis inşaat gereklidir sanırım rağmen. Belki de sorumluluk ile ilgili bir sorun var, Domain Nesne tasarrufu ile yük olmamalıdır. Bu sadece Active Record desen oldukça düzgün bir özellik değil - bir şekilde uygulamak güzel olurdu.

1 Cevap

Ben ne, belki eylem en iyi ders, benim sınıfları için net bir adlandırma kuralı, FI olması değil olsa: user_User alanı nesne ve user_mapper_User bu mapper olması.

Benim ebeveynde domainObject class ben mapper var bulmak için mantık kodu.

Sonra ona temsilci bir kaç seçenek var, bariz bir domainObject olarak __call() yöntemini kullanmak olacaktır.