1

Ich habe ein Repository für meine Geschäftsobjekte, und ich muss verschiedene Objekte basierend auf den Daten erstellen. Soll ich sie im Repo direkt anlegen oder den Code irgendwo anders verschieben - in die Factory oder eine Klasse in der Business-Logik-Ebene?Wo soll ich Objekte erstellen? Repository? Fabrik?

/** 
* @returns Applier 
*/ 
class ApplierRepository implements IApplierRepositoryInterface { 
    //some code 
    public function find($id) { 
    $data = $this->findBySql($id); 

    //Is it a business logic? 
    if($data['profile_id'] != null) 
     $object = new ProfileApplier(); 
    if($data['user_id'] != null) { 
     $user = $this->userRepository->find($data['user_id']); 
     $object = new UserApplier($user); 
    } 
    //... 
    return $object; 
    } 
} 

Antwort

1

würde ich Repository als Abstraktionsebene zwischen Datenzugriffsebene und Ihre Anwendungslogik betrachten. Was haben Sie in Ihrer find() Methode ist eigentlich eine Factory-Methode.

Um die Dinge klar zu machen, sich vorstellen, dass Sie müssen mit ein Testahmen die Logik Ihrer Klasse zu testen. Was würden Sie tun? Es scheint, wie Ihr ProfileApplier, UserApplier und andere Applikatoren rufen einige Datenquellen Nutzdaten retrive.

In Testmethoden müssen Sie diese Datenquellen durch Testdaten ersetzen. Sie müssen auch die Datenquellenzugriffsmethoden ersetzen. Und das ist das Repository Muster ist für entwickelt.

Mehr sauberer Ansatz wäre so etwas wie die folgenden:

class AppliersFactory { 
    IApplierRepository applierRepository; 

    public AppliersFactory(IApplierRepository repo) 
    { 
    $this->applierRepository = repo; 
    } 

    // factory method, it will create your buisness objects, regardless of the data source 
    public function create($data) { 
    if($data['profile_id'] != null) 
     $return new ProfileApplier(); 
    if($data['user_id'] != null) { 
     $user = $this->applierRepository->find($data['user_id']); 
     $object = new UserApplier($user); 
    } 
    //... 
    return $object; 
    } 
} 

Verwendung dieses Repository in Ihrer realen Anwendung

class RealApplierDataStorageRepository implements IApplierRepositoryInterface { 
    //some code, retrieves data from real data sources 
    public function find($id) { 
    //... 
    } 
} 

und verwenden diese in Testmodule Ihre Logik

class TestApplierDataStorageRepository implements IApplierRepositoryInterface { 
    // some code, retrieves data from test data sources (lets say, some arrays of data) 
    public function find($id) { 
    //... 
    } 
} 
zu testen

Hoffe, es hilft

+0

Vielen Dank! Das habe ich gesucht. –

+0

Sie sind herzlich willkommen! –