9

J'essaie de comprendre comment fonctionne le modèle Repository et comment il peut être implémenté dans un modèle MVC personnalisé. Dans la mesure où je le comprends, le Repository est une couche qui renvoie simplement des données d'une classe d'entité ou enregistre la classe d'entité dans une couche persistante.Configuration d'un modèle de référentiel dans MVC

Maintenant, je vois actuellement comme ceci:

Une demande vient dans mon contrôleur pour créer un utilisateur. Juste un nom d'utilisateur et mot de passe. Mon contrôleur fera quelque chose comme ceci:

function CreateAction () 
{ 
    $userRepo = new userRepository (); 
    $user = new userEntity (); 

    $user->setUsername('user'); 
    $user->setPassword('123456'); 

    $userRepo->create($user); 
} 

Alors mon userRepository classe ressemble à ceci:

class userRepository 
{ 
    public function create (User $user) 
    { 
     $this->db->exec ("INSERT INTO ... QUERY TO SAVE THE USER"); 
    } 
} 

Et mon userEntity classe ressemble à ceci:

class userEntity 
{ 
    private $username; 
    private $password; 

    public function setUsername ($username) 
    { 
     $this->username = $username; 
    } 

    public function getUsername () 
    { 
     return $this->username; 
    } 

    public function setPassword ($password) 
    { 
     $this->password = $password; 
    } 

    public function getPassword () 
    { 
     return $this->password; 
    } 
} 

maintenant la première chose que je pense est faux ici est que j'utilise une requête à l'intérieur de la classe de dépôt. Où puis-je enregistrer la classe userEntity dans la base de données? Donc, en d'autres termes, où puis-je effectuer les requêtes SQL réelles? Je suppose que la bonne façon serait d'appeler un DAO à l'intérieur de la méthode 'create' du référentiel. Mais j'essaie toujours de comprendre à quoi ressemble un DAO et à quel point il est différent d'un 'Model' en termes de Model dans un pattern MVC.

Mais à part cela, est-ce la bonne façon d'implémenter le modèle de dépôt?

+4

Ça me semble plutôt bien.Le référentiel est l'emplacement correct pour sql. Peut-être voudrez-vous jeter un coup d'œil au manuel Doctrine2 ORM juste pour avoir des idées. – Cerad

Répondre

12

Votre référentiel ressemble beaucoup plus à une TableDataGateway. L'idée d'un référentiel doit être une autre couche au-dessus de la couche de mappage qui sert de médiateur entre les objets de domaine et la base de données. Il sert aussi de stockage en mémoire des objets de domaine (quelque chose qui manque à votre exemple) et peut encapsuler une Usine pour créer de nouvelles Entités. Ils permettent souvent aussi d'interroger le référentiel par des motifs Spécification:

Repository Sequence Diagram from POEAA

Il est un modèle assez complexe. Vous pouvez trouver de bons revalorisations sur dépôt dans

Vérifiez également Good Domain Driven Design samples

0

Oui, ceci est une mise en œuvre correcte du modèle référentiel. Le modèle DAO est souvent utile également, mais il n'y a rien de mal dans votre implémentation. DAO est un modèle simple qui sépare votre logique de persistance de votre logique métier. Cela créerait des opérations CRUD alors que votre entité contiendrait des méthodes pour votre logique métier, donc c'est séparer les responsabilités de la persistance de votre domaine. J'utilise habituellement DAO pour les entités uniques et les dépôts pour les agrégats, ce qui me permet de faire des choses comme productCatalogRepository.Update(), qui à son tour va parcourir les DAOs du produit et les faire stocker eux-mêmes.

Questions connexes