Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 10-06-2009 02:06:57

shiryu
Membre
Date d'inscription: 10-06-2009
Messages: 13

Comment organisez-vous votre ORM ?

Je suis en plein développement d'un projet et je ne suis pas satisfait de ma façon de gérer les accès à la BD.

Voici ce que je fais par exemple pour la table users

  - je crée une classe UserGateway qui étend Zend_Db_Table_Abstract pour avoir une interface d'accès à la table
  - dans cette classe je définie $_rowClass = 'User'
  - je crée la classe User qui étend Zend_Db_Table_Row_Abstract

Quand je fais appel à un utilisateur avec UserGateway, je récupère automatiquement une instance de User avec les propriétés de mon objet.

Dans la classe User se trouve aussi toute la logique métier (par exemple les méthodes login(), logout()).

UserGateway contient par contre toutes les méthodes ORM (findByEmail(), findByPays(), etc.)

PROBLEME :

Retourner automatiquement une instance User avec les propriétés de l'objet, c'est sympa car on a aussi accès immédiatement à toutes les méthodes de l'objet, mais que faire si on a juste besoin de récupérer l'email certaines fois sans avoir besoin des méthodes de l'objet ?

J'ai aussi l'impression d'avoir à écrire une méthode par requête ce qui me fait perdre beaucoup de temps. Est-il bon d'écrire la requête SQL dans User et de simplement faire appel à UserGateway()->query() pour exécuter la requete ? Ou alors toutes les requêtes doivent être dans UserGateway, et on y accède via des méthodes publiques ?

Ensuite comment classer une méthode qui fait appel à des données de 2 tables 'users' et 'comments' ? On placera la méthode dans UserGateway ou dans CommentGateway ?

Voici mon arborescence :
   -->models
        -->Users
             -->User.php
             -->UserGateway.php

Hors ligne

 

#2 10-06-2009 07:36:28

lesauf
Membre
Lieu: Yaoundé - Cameroun
Date d'inscription: 29-11-2007
Messages: 52
Site web

Re: Comment organisez-vous votre ORM ?

shiryu a écrit:

Dans la classe User se trouve aussi toute la logique métier (par exemple les méthodes login(), logout()).

Bien chez moi ces fonctions sont dans le controlleur. Ma classe Row est pratiquement vide

shiryu a écrit:

UserGateway contient par contre toutes les méthodes ORM (findByEmail(), findByPays(), etc.)

Pareil pour moi, sauf que j'ai intégré le design pattern façade. Ainsi, j'ai un seul point d'entrée pour appeller toutes les fonctions du modèle

shiryu a écrit:

PROBLEME :

Retourner automatiquement une instance User avec les propriétés de l'objet, c'est sympa car on a aussi accès immédiatement à toutes les méthodes de l'objet, mais que faire si on a juste besoin de récupérer l'email certaines fois sans avoir besoin des méthodes de l'objet ?

J'utilise la fonction toArray() dans mes rows pour récupérer uniquement les champs.

shiryu a écrit:

J'ai aussi l'impression d'avoir à écrire une méthode par requête ce qui me fait perdre beaucoup de temps. Est-il bon d'écrire la requête SQL dans User et de simplement faire appel à UserGateway()->query() pour exécuter la requete ? Ou alors toutes les requêtes doivent être dans UserGateway, et on y accède via des méthodes publiques ?

Chez moi c'est le cas, toutes les requètes dans table.

shiryu a écrit:

Ensuite comment classer une méthode qui fait appel à des données de 2 tables 'users' et 'comments' ? On placera la méthode dans UserGateway ou dans CommentGateway ?

Ben, à mon avis ça dépend de quel controlleur tu appelle cette méthode. J'ai écris certaines méthodes de ce genre dans mon modèle, je les ai mis dans le modèle "principal" du controlleur concerné (dans user_Table pour UserController par exemple).

Voici mon arborescence :
   -->Model
        -->User
             -->Form
                 -->Default.php
                 -->Login.php
             -->Table.php
             -->Row.php
        -->User.php (Composant de la façade)

J'ai mis en ligne un squelette d'application (crud).
Tu peux peut-etre t'en inspirer...

Cordialement,
Lesauf

Hors ligne

 

#3 18-06-2009 02:14:15

shiryu
Membre
Date d'inscription: 10-06-2009
Messages: 13

Re: Comment organisez-vous votre ORM ?

Merci pour ta réponse. J'ai trouvé un topic sur le forum qui parle du Quickstart de Zend Framework et d'une solution par Mappers.

C'est intéressant mais je me vois mal corriger plusieurs classes chaque fois que j'ajoute une colonne dans une table...

Je songe en fait à me débarrasser de Zend_Db pour gérer la chose rapidement et efficacement moi-même. Quitte à utiliser de l'Active Record et de mettre mon code SQL dans les classes métiers du modèle. Tant pis pour la séparation de la couche mais au moins je n'aurai pas à modifier plusieurs fichiers à la moindre modif de la base de données.

Je pourrai toujours exporter les instructions SQL plus tard vers un Mapper si ça ce justifie. Parfois je crois qu'être trop puriste nuit gravement à l'efficacité et à la rentabilité d'un projet.

Hors ligne

 

#4 18-06-2009 09:07:58

lesauf
Membre
Lieu: Yaoundé - Cameroun
Date d'inscription: 29-11-2007
Messages: 52
Site web

Re: Comment organisez-vous votre ORM ?

Hum, le fait est que Zend_Db récupère lui-même les noms des champs de la bd. Ainsi, (à moins de changer le nom de la table) tu n'a pas à "corriger plusieurs classes chaque fois que j'ajoute une colonne dans une table".

Peut-etre que si tu jetais un oeil à mon squelette d'application tu comprendrais un peu mieux.

L'idée c'est justement de ne pas gérer la chose soit-même (c'est pour ça qu'on utilise un framework).

A plus,
Lesauf

Dernière modification par lesauf (18-06-2009 09:10:49)

Hors ligne

 

#5 18-06-2009 10:38:45

shiryu
Membre
Date d'inscription: 10-06-2009
Messages: 13

Re: Comment organisez-vous votre ORM ?

Oui en effet Zend_Db_Table_Row récupère les champs et met les infos dans un attribut $_data.

C'est très pratique, mais cela induit qu'il faille utiliser une classe par table et que dès que ça devient un peu compliqué (plusieurs tables pour un objet), cette solution n'est plus aussi pratique (on perd l'intérêt du CRUD aussi).

L'autre problème est que les classes métiers n'ont plus d'attributs autres que $_data qui contient toutes les informations sur l'état de l'objet. C'est en quelque sorte préformatter le modèle pour Zend Framework. Le jour où tu veux migrer vers une autre technologie, c'est quasi impossible sans reprogrammer des pans entiers.

Par contre je pense que les évolutions du Framework dans le futur apporteront une solution à ce genre de problème assez fréquents d'après ce que je vois sur le forum. Donc Zend_Db évvoluera sans doute, et par conséquent on a tout intérêt à l'utiliser aujourd'hui pour profiter de ses évolutions demain. C'est un peu miser sur l'avenir.

J'ai lu un post de Julien Pauli (désolé je n'ai pas gardé le lien du post) qui lui-même dit que Zend_Db_Table est adapté pour une relation 1 classe = 1 table, et que si le projet est plus complexe il faut un peu personnaliser sa solution. C'est l'un des atouts du framework, la possibilité de personnaliser. Mais si chacun adapte son système dans son coin, alors on s'éloigne de la standardisation d'un framework.

Je pense que ça serait bien que le projet fournisse une solution un peu plus évoluée pour l'ORM. Dans le quickstart ils proposent une solution avec un mapper qui me semble être un bon début mais là aussi il faut retaper à la main plusieurs infos si on change la base de données.

Sinon il y des solutions comme Propel et Doctrine. En d'autres termes pas mal de temps à apprendre un autre système, alors qu'une solution personnelle serait rapide (et sans transformer l'ORM en usine à gaz)

Dernière modification par shiryu (18-06-2009 22:06:07)

Hors ligne

 

#6 18-06-2009 11:29:04

ramos
Membre
Date d'inscription: 19-03-2009
Messages: 14

Re: Comment organisez-vous votre ORM ?

J'ai le même problème avec le Zend Framework que toi Shiryu. J'ai fait un autre post sur le forum qui rejoint celui-ci : http://www.z-f.fr/forum/viewtopic.php?id=3401

J'ai regardé Propel et Doctrine, Doctrine a apparemment déjà été intégré au ZF avec succès, et permet d'avoir un solution ActiveRecord à l'ORM dans le Zend Framework. Mais Doctrine l'avoue lui même, ActiveRecord est pas idéal, et Domain Model (ou Domain-Driven Design) serait mieux.

Et justement, je redonne les liens vers deux blogs en anglais qui donnent des pistes intéressantes pour faire du Domain Model ave ZF :
Celui que je préfère, proche du quickstart de ZF 1.8 avec le pattern Mapper : http://www.angryobjects.com/2009/03/30/ … framework/,
Et le second, avec le pattern Gateway : http://weierophinney.net/matthew/archiv … cture.html.

J'espère que ça pourra aider !

Hors ligne

 

#7 18-06-2009 11:35:16

lesauf
Membre
Lieu: Yaoundé - Cameroun
Date d'inscription: 29-11-2007
Messages: 52
Site web

Re: Comment organisez-vous votre ORM ?

Ce que tu dis m'intéresse, même si je ne suis pas un expert en base de données. Lorsqu'on parle de relation 1-1, c'est hormis les enregistrements dans plusieurs tables à la fois et les jointures, c'est bien ça?

Si c'est réllement le cas, chez moi j'ai intégré la gestion des jointures dans Fast_Db_Table. Mais pour les enregistrements dans plusieurs tables je vais appel aux objet Db_Table correspondant à ces tables.

Je ne comprend pas bien ce que c'est que le mapper, je n'ai pas encore examiné Doctrine ou Propel, et je n'ai pas lu le nouveau quickstart. Ce qui veut dire que j'ai encore beaucoup de doc à lire, houlala.

Je vais m'y mettre dès que j'ai le temps. Merci.

Lesauf

@Ramos : Merci pour les liens

Dernière modification par lesauf (18-06-2009 12:22:54)

Hors ligne

 

#8 18-06-2009 22:44:54

shiryu
Membre
Date d'inscription: 10-06-2009
Messages: 13

Re: Comment organisez-vous votre ORM ?

@lesauf
Désolé pour la confusion 1-1, c'est moi qui ai induit une incompréhension inutile. J'ai corrigé mon post, je voulais parler du principe créer une classe pour un table de la base de données. Chaque classe accède à sa table, c'est le modèle proposé par Zend Framework dans la doc (au jour d'aujourd'hui du moins !). Dans la pratique, on a vite besoin qu'une classe puisse accéder aux données de plusieurs tables sans avoir à créer des vue systématiquement dans la table.

Le mapper est une classe intermédiaire entre une classe et la base de données. Le verbe "mapper" signifie faire correspondre les données d'une structure avec une les données d'une autre structure. L'idée du mapper est de rendre totalement indépendantes les classes métiers et la base de données. La classe ne doit pas connaître la BDD et la BDD ne doit pas connaître la classe. Si elles veulent communiquer elles doivent passer par le mapper. Dans le quickstart, ce n'est pas un vrai mapper car ils proposent $user->save(). C'est à dire encore une fois que la classe métier sauvegarde (donc sait qu'une base de données existe !!, ce qui rend l'intérêt d'un mapper nul).

Dans une vraie conception du mapper, c'est comme Ramos le dit, la sauvegarde d'un objet se fait ainsi : $mapper->save($user). La méthode save s'occupe alors de décortiquer ton objet et d'enregistrer les infos à la bonne place.


@Ramos
Tu as trouvé en effet un site très intéressant. Son approche est assez différente et je vais réfléchir sur ses possiblités par rapport à mon application.

Par contre je ne comprends pas vraiment en quoi il utilise un mapper. D'après ce que j'ai compris, il structure son application en services. C'est à dire que si le controller a besoin de quelque chose, il fait appel à un service. Ce service s'occupe de charger les objets nécessaires et les données des objets pour créer un résultat qui est renvoyé. Dans ce schéma les classes métiers et la base de données sont bien séparées.

Ce qui est sympa, c'est qu'il crée des classes spécifiques pour chaque table qui permet d'accéder aux données, MAIS sans jamais générer des objets métiers à partir de ces données, et c'est bien là que la doc de Zend Framework mélange un peu tout. Un Zend_Db_Row n'est pas égal à une classe ! Un Zend_Db_Row est comme son non l'indique une ligne dans une table. Le modèle proposé permet donc d'utiliser un service pour enregistrer ou récupérer les données à partir de n'importe quelle table (on utilisera les classes dérivées de Zend_Db_Table pour récupérer des données d'une table, ou au besoin Zend_Db_Table_Select si les requêtes sont plus spécifiques (jointures et autres joies de l'informatique !). Si c'est une sélection sur une table, elle renverra un Zend_Db_Table_Row par exemple, c'est le service qui le récupère et l'exploite pour alimenter mon objet ; le service poursuit toutes ses opérations pour créer le résultat qu'on lui demande et le renvoie.

Le principe est très proche du mapper, mais un service peut mélanger toutes sortes de choses : la gestion des logs, du cache, de la BD, du filtrage, etc. Le mapper est spécifique à la gestion de la base de données uniquement.

C'est très intéressant car le service permet justement de gérer plusieurs choses à un endroit stratégique de l'application ET surtout il permet de faire évoluer l'application vers d'autres supports (téléphones portables, etc.) treès facilement.

Un GRAND merci à toi pour ce lien, je vais regarder un peu plus ce design pattern pour trouver une vraie solution (celle de Zend est un peu décevante je trouve et fausse certaines bonnes pratiques).

Hors ligne

 

#9 19-06-2009 11:23:17

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: Comment organisez-vous votre ORM ?

Bonjour,

Je ne connais pas bien le pattern Mapper, mais je me demande qu'elle est fondamentalement la différence avec le pattern façade ?

Sachant que la façade est une interface d'accès aux données entre les controlleurs et les modèles. Les controlleurs s'adressent toujours à la façade et toujours de la même façon, la façade traduit la demande des controlleurs pour les modèles et renvoie un résultat formaté toujours de la même façon.
Ex.

Code:

// façade
public function getTrucList() {
    $t_truc = new Truc_Table();
    $rows = new stdClass();
    $rows->items = $t_truc->fetchAll();
    $rows->itemCount = $rows->items->count();

    return $rows;
}

Lorsque la techno change pour la persistance, seule la façade est ré-écrite. De mon côté je découpe les façades en fonction du métier et selon le nombre de points d'accès que je vais avoir.

Je suis peut-être hors-sujet, mais tout ceci m'intéresse.

A+ benjamin.

Dernière modification par Delprog (19-06-2009 12:07:23)


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#10 19-06-2009 11:47:07

lesauf
Membre
Lieu: Yaoundé - Cameroun
Date d'inscription: 29-11-2007
Messages: 52
Site web

Re: Comment organisez-vous votre ORM ?

Moi aussi je travaille avec une façade découpée en composants. Mais si j'ai bien compris (je n'ai pas encore pris le temps de faire de recherches), le mapper est entre le modele et la bd.

Ainsi on aurait :
Controlleur -> façade -> modele -> Mapper -> BD.

J'ai bien compris?

Hors ligne

 

#11 19-06-2009 11:48:51

Moimeme
Membre
Date d'inscription: 19-04-2007
Messages: 120

Re: Comment organisez-vous votre ORM ?

Moi j'ai compris plutôt que le mapper = façade .... c'est la même chose.

Hors ligne

 

#12 19-06-2009 13:38:55

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: Comment organisez-vous votre ORM ?

D'après ce que je lis dans le Quickstart, les deux patterns (façade et mapper) ont le même but et sont complémentaires. Leur implémentation diffère un peu.

Dans le pattern façade, les modèles sont directement invoqués et les requêtes directement traduites pour ces modèles.

Dans la conception que je vois dans le Quickstart, Default_Model_Guestbook porte la logique métier, et ensuite derrière, le mapper est équivalent à une façade et connait l'organisation de la base de données et les classes qui correspondent.

Donc de même qu'avec le pattern façade, si la techno pour la persistance change, seul le mapper est ré-écrit (avec les classes de la persistance biensur). Le métier ne change pas et les controlleurs eux ne sont jamais touchés.

Je dirais que c'est donc le mapper qui va porter les méthodes censées retourner des données de plusieurs tables. Il invoquera toutes les collections de données nécessaires pour répondre à la demande métier.

C'est donc à lui de savoir quelles sont les classes à charger et les méthodes à invoquer dans les modèles.
Donc attention, le mapper n'est pas lié à une table, c'est simplement une interface entre le métier et la persistance.

En ce qui concerne la répétition de code, parfois c'est inévitable.
Il faut surtout comprendre que les setters et les getters sont écrit pour le métier et non pour les modèles.
Si je veux récupérer un commentaire, je dois implémenter une méthode getComment(), peu importe la façon dont sont organisées les données, c'est au mapper de se démmerder avec ça. S'il doit invoquer plusieurs modèles ou faire appel à une méthode qui récupère des données sur plusieurs tables jointes, celà ne concerne ni le métier ni le controlleur. Pour le controlleur, getComment() renvoie un commentaire, pas besoin d'en savoir plus.

En tout cas, tout ça est très intéressant. Je trouve que Zend aborde le sujet un peu tard.
Pour une petite application il est certain que toute cette conception est sur-dimensionnée, mais dès que le métier est un peu plus complexe, ça prend tout son sens.

J'ai pas trop approfondie la chose, je lis la doc et le quickstart pour l'instant et je compare avec ce que j'avais implémenté de mon côté.

N'hésitez pas à m'arrêter si vous pensez que je me trompe, que je n'induise personne en erreur smile


A+ benjamin.

Dernière modification par Delprog (19-06-2009 13:48:43)


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#13 19-06-2009 13:56:57

Moimeme
Membre
Date d'inscription: 19-04-2007
Messages: 120

Re: Comment organisez-vous votre ORM ?

Je nage de plus en plus.
Je sais que c'est un peu long à faire mais ça pourrait être plus parlant si on avait un exemple concret assez complexe (qui attaques plusieurs tables avec du n-n et 1-n par exemple ..) coté métier pour voir l'implémentation de tout ça.
Merci d'avance si une personne compétente s'y colle smile

Dernière modification par Moimeme (19-06-2009 13:58:09)

Hors ligne

 

#14 19-06-2009 16:32:29

shiryu
Membre
Date d'inscription: 10-06-2009
Messages: 13

Re: Comment organisez-vous votre ORM ?

Je suis d'accord avec ce schéma qui place très bien le mapper et une façade à leur place :

Controlleur -> façade -> modele -> Mapper -> BD

La Façade est un design pattern qui ne devrait faire appel qu'à des méthodes du modèle. Elle sert à faciliter l'utilisation du modèle. Par exemple, j'ai 4 télécommandes pour gérer ma télé, mon ampli, canalsat, mon magnétoscope. Si je veux enregistrer TF1, je dois allumer chacun de ces appareils, mettre canalsat sur TF1 et exécuter le mode enregistrement de mon magnétoscope. Très compliqué notre modèle métier pour une personne qui connaît pas. Pour ma grand-mère qui veut enregistrer les feux de l'amour mais ne pige rien à tous ces appareils, je lui crée une télécommande spéciale (la façade). Elle appuie sur un bouton, et toutes les opérations nécessaires sont exécutées automatiquement. La façade n'a aucun rapport avec la base de données. Dans les gros projets elle sert souvent aux équipes pour leur faciliter l'utilisation du modèle, comme ça ils peuvent développer sans avoir à tout comprendre de la complexité du modèle. Ainsi plusieurs équipes peuvent travailler sur un même projet mais sur des parties différentes.

En revanche le Mapper sert exclusivement à faire correspondre la structure d'une classe avec la structure d'une ou plusieurs tables dans la base de données. Le Mapper est une approche de la gestion des données. La Façade est une facilitation du modèle.

Dernière modification par shiryu (19-06-2009 16:39:15)

Hors ligne

 

#15 19-06-2009 16:44:14

Moimeme
Membre
Date d'inscription: 19-04-2007
Messages: 120

Re: Comment organisez-vous votre ORM ?

Merci pour ces infos mais je pige de moins en moins : façade -> modele -> Mapper
Personne peux coller un bout de code de chacun de ces bloc avec les interactions entre eux et si possible pour un cas complexe (qui peux le plus peux le moins) ? car la j'avoue que je nage carrément.

Actuellement par exemple j'ai ca dans ma façade, c'est pas la bonne approche ? :

Code:

public function getToto($where = null, $page = 1, $nbPerPage = 15){
        $table      = new Table_Toto();
        if($where == null) $statment   = $table->select();
        else $statment = $table->select()->where($where);
        $paginator  = Zend_Paginator::factory($statment);
        $paginator->setCurrentPageNumber($page);
        $paginator->setItemCountPerPage($nbPerPage);
        return $paginator;
   }

Merci d'avance.

Dernière modification par Moimeme (19-06-2009 16:50:46)

Hors ligne

 

#16 19-06-2009 16:55:26

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: Comment organisez-vous votre ORM ?

Exactement,

Donc la façade n'a pas d'intérêt ici je dirais.

Et le schéma serait plutôt,

Controlleur -> classe métier -> Mapper -> modèle

Dans le Quickstart:

Controlleur -> Default_Model_Guestbook -> Default_Model_GuestbookMapper -> Db_Table

Default_Model_Guestbook : porte la logique métier
Default_Model_GuestbookMapper : transforme les requêtes pour les Db_Table
Db_Table : persistance.

De la même manière qu'une Façade le Mappeur peut-être une coquille vide, on peut donc mettre un bouchon, avancer sur le dev de l'application sans encore avoir implémenté la couche qui gère la persistance.

Pour moi ce sont deux conceptions, et dans ce cas, je ne vois pas l'intérêt d'utiliser et une Façade et le Mapper.
La classe métier pluggée à un Mapper suffisent.

Mais je planche encore dessus, peut-être que quelquechose m'échappe.


A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#17 19-06-2009 23:34:12

ramos
Membre
Date d'inscription: 19-03-2009
Messages: 14

Re: Comment organisez-vous votre ORM ?

Je ne suis pas trop d'accord avec les schémas proposés, personnellement je voyais la chose comme ça :

Contrôleur -> Mapper -> BDD (Zend_Db)

Entre mapper et BDD transitent des Row (lignes de données de la base) ou des Statement (Zend_Db_Statement).
Entre mapper et Contrôleur transitent des objets métier.
Le mapper se pose pas de questions sur les objets métiers à renvoyer ou pas, etc. Il obéit et construit ce que le contrôleur lui demande.
Le contrôleur gère la logique métier uniquement en manipulant des objets métier.

Et pour moi, un objet métier ne doit pas avoir de méthodes, que des attributs.

C'est comme ça que j'ai compris les principes proposés sur les différents blogs dont j'ai donné les liens hier.
Ensuite, le mapper n'est pas une facade parce qu'il propose des méthodes inédites, comme des jointures de tables.

Bonne soirée, A+

Hors ligne

 

#18 20-06-2009 11:47:46

shiryu
Membre
Date d'inscription: 10-06-2009
Messages: 13

Re: Comment organisez-vous votre ORM ?

oui je comprends pourquoi tu vois le mapper dans ce schéma :

Contrôleur -> Mapper -> BDD (Zend_Db)

Cela dépend si on le voit d'un point de opérationnel ou fonctionnel.

Dans la façon opérationnelle (sa mise en oeuvre) :
on l'instancie dans le Contrôleur et on exécute ses méthodes qui gère nos données. Par exemple dans le contrôleur :

Code:

// mon objet métier
$u = new User();
$u->setNom('toto');
$u->setPrenom('tata');

// mon mappeur pour gérer les données de l'objet métier User
$m = new $mapperUser();
// enregistre mon objet métier en base de données
$m->save($u);

// je veux charger un User à partir de son email
// le mappeur va charger toutes les données de l'objet s'il trouve un résultat
$u2 = $mapper->findByEmail('titi@exemple.com');

On voit que le mapper sait gérer les instances de User et sait parfaitement où se trouvent les données. Jamais on ne fait appel à une requête depuis l'objet métier. Le quickstart présente pourtant un schéma de ce genre $u->save() qui fait appel à $m->save(), ce qui est contraire aux objectifs du mapper.

Dans la façon fonctionnelle (son rôle, sa fonction) :
Comme il est joue le rôle d'adaptation des données d'une structure objet à une structure de base de données relationnellle, et inversement, on le voit alors de façon conceptuelle située entre le modèle métier et la base de données. Il s'agit d'une vision en couches, donc plus abstraite. La vision opérationnelle est une vision concrète

Dernière modification par shiryu (20-06-2009 12:03:28)

Hors ligne

 

#19 20-06-2009 17:26:45

Moimeme
Membre
Date d'inscription: 19-04-2007
Messages: 120

Re: Comment organisez-vous votre ORM ?

Moi je pensais que c'était le mapper qui manipuler les objets métiers et donc dans le controller on avait ca :

Code:

Controller :
$m = new $mapperUser();
$userid = $m->addUser('toto','tata');

Hors ligne

 

#20 21-06-2009 11:46:35

shiryu
Membre
Date d'inscription: 10-06-2009
Messages: 13

Re: Comment organisez-vous votre ORM ?

Je ne vois pas de contre-indication à ce que tu proposes, c'est tout à fait possible de le concevoir comme ça. Et rien ne t'empêche d'avoir à la fois un save() et un addUser() dans ton mapper.

Avec une méthode find() c'est particulièrement utile d'avoir à passer juste l'id unique plutôt que tout un objet :

Code:

// id unique du user
$userId = 1;

// instancie le mapper pour les users
$m = new $mapperUser();

// récupère une instance de User() à partir du mapper qui se charge de créer
// l'instance de lui effecter ses données et de retourner un resultat
$user = $m->find($userId);

Ce qu'il faut comprendre c'est que le Mapper ne doit pas encapsuler exclusivement le modèle. Tu peux parfaitement avoir une instance de User dans le controller, c'est là pour ça. Le modèle doit gérer toute la logique de l'application. Tu fais appel au Mapper juste pour gérer la persistance de tes objets de et vers la base de données.

Dernière modification par shiryu (21-06-2009 15:11:03)

Hors ligne

 

#21 22-06-2009 11:42:16

Moimeme
Membre
Date d'inscription: 19-04-2007
Messages: 120

Re: Comment organisez-vous votre ORM ?

Je vois mais par exemple pour un menu de type arborescence multi niveau stocké en base de donné (en père fils, pas en intervallaire). Ça donnerait quoi coté code controller, mapper, et bdd ? pour son affichage par exemple ?

Dernière modification par Moimeme (22-06-2009 11:43:00)

Hors ligne

 

#22 17-07-2009 14:52:25

phifeshaheed
Membre
Date d'inscription: 06-05-2009
Messages: 29

Re: Comment organisez-vous votre ORM ?

ramos a écrit:

Et justement, je redonne les liens vers deux blogs en anglais qui donnent des pistes intéressantes pour faire du Domain Model ave ZF :
Celui que je préfère, proche du quickstart de ZF 1.8 avec le pattern Mapper : http://www.angryobjects.com/2009/03/30/ … framework/,
Et le second, avec le pattern Gateway : http://weierophinney.net/matthew/archiv … cture.html.

J'espère que ça pourra aider !

Deux tres bonne slectures à condition de prendre le temps de bien lire et comprendre

Hors ligne

 

#23 20-07-2009 16:15:18

phifeshaheed
Membre
Date d'inscription: 06-05-2009
Messages: 29

Re: Comment organisez-vous votre ORM ?

En tout cas le mapper pattern semble etre la voie vers laquelle se dirige zend framework http://framework.zend.com/wiki/pages/vi … Id=9437243

Hors ligne

 

#24 21-07-2009 01:08:35

slaughter
Membre
Date d'inscription: 01-04-2008
Messages: 217

Re: Comment organisez-vous votre ORM ?

Moi je trouvais simple de pouvoir faire

Code:

$u = new User();
$u->setNom('toto');
$u->setPrenom('tata');
$u->save;

ou encore

Code:

$u = new User();
$u->find('2'); //pour trouver le user d'ID = 2

ou même

Code:

$u = new User();
$u->findByEmail('toto@titi.com');

Symphony semble fonctionner de cette façon. A aucun moment nous avons accès directement au mapper...

Hors ligne

 

#25 21-07-2009 08:12:30

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Comment organisez-vous votre ORM ?

c'est pareil dans ZF mais avoir accès au mappage te permet d'en faire plus

A+JYT

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages