Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 06-05-2009 17:08:01

OsoPardo
Membre
Date d'inscription: 16-09-2008
Messages: 32

[Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

Comme à chaque nouvelle version je refait un tour dans la doc et le Quickstart pour mettre à jour ma structure de projet par défaut

Avec la version 1.8 j'ai eu un peu de boulot avec Zend_Application ([edit]ce qui suit est sans rapport avec Zend_Application) mais ce qui me choque c'est la partie Create a Model and Database Table du Quickstart :

Quand j'ai commencé le ZF (version 1.5 je crois) un objet d'accès à une table c'était simplement :

Code:

class UserDAO extends Zend_Db_Table_Abstract
{
    /** Table name */
    protected $_name    = 'user';
}

et on manipulait les objets Zend_Db_Table_Row obtenus comme si on avait vraiment, par exemple, un objet User

Pas forcement super propre et carré mais tellement simple et excitant !

Maintenant on a plus de 10 pages pour expliquer comme créer l'accès à une table, avec trois classes dont une de 70 lignes et l'autre 120 lignes !

Franchement si j'avais vu un quickstart pareil quand je cherchais quel framework utiliser, je serait certainement passé à un autre, sans prendre le temps de regarder en détails le pourquoi du comment de toute cette conception.

OK c'est de la POO carrée, réutilisable, modulable, etc, mais c'est taillé pour quel type de projet ? Certainement pas une première application...


Au delà du coup de gueule, je m'interroge quand même sur l'utilité de cette conception pour des sites à moyen trafic comme ceux que j'ai à concevoir habituellement (articles, news, vente en ligne).

Il me semble très peu probable qu'un de mes sites passe d'un stockage base de données à un autre type (XML ? RDF ?) donc rajouter une couche d'abstraction supplémentaire à PDO et Zend_Db_Table, ça me parait un peu excessif, long à développer (si on a pas de générateur de code), et consommateur supplémentaire de ressources, pour de faibles gains.

Et vous ? Quel est votre avis ? Quelle pratique adoptez vous ?

Dernière modification par OsoPardo (06-05-2009 17:55:04)

Hors ligne

 

#2 06-05-2009 17:28:58

nick
Membre
Date d'inscription: 31-05-2008
Messages: 84

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

c'est l'intérêt à mon avis de Zend par rapport aux autres framework, c'est que rien ne t'oblige à utiliser zend_application, tu peux utiliser les composants que tu veux.

Dernière modification par nick (06-05-2009 17:39:15)

Hors ligne

 

#3 06-05-2009 17:42:08

OsoPardo
Membre
Date d'inscription: 16-09-2008
Messages: 32

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

Oui mais en fait mes interrogations n'ont rien à voir avec Zend_Application, la mention de Zend_Application juste dans mon introduction 36-15malife smile

(Précision rajoutée dans mon premier post)

Dernière modification par OsoPardo (06-05-2009 17:43:26)

Hors ligne

 

#4 13-05-2009 17:26:21

kreatik
Membre
Date d'inscription: 14-04-2009
Messages: 26

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

Salut je suis du même avis, je reprend un nouveau projet d'apprentissage mais avec le 1.8 et je suis en train de chercher l'interêt de creer cette classe de mapping...

Hors ligne

 

#5 14-05-2009 13:09:26

kreatik
Membre
Date d'inscription: 14-04-2009
Messages: 26

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

Si par exemple je prend exactement la même procédure que le quickstart, et que je souhaite avoir une fonction getActiveBook() afin de me retourner les livres actifs (valeur de type BOOL 1/0 dans la db) j'ai donc créer cette fonction dans application/models/Book.php (classe "Default_Model_Book") :

Code:

    public function getActiveBook(){
        $activeBooks = $this->getMapper()->getDbTable()->select('titre')->where('active = ?',1);
        return $this->fetchAll($activeBooks);
    }

mais ça ne fonctionne pas, est-ce le bon endroit pour ce type de fonction plutot que dans le controlller ?

Hors ligne

 

#6 15-05-2009 13:38:30

nick
Membre
Date d'inscription: 31-05-2008
Messages: 84

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

OsoPardo a écrit:

Oui mais en fait mes interrogations n'ont rien à voir avec Zend_Application, la mention de Zend_Application juste dans mon introduction 36-15malife smile

(Précision rajoutée dans mon premier post)

On n'est pas obligé de faire comme ça. Tu peux même ne définir aucun modèle et faire toutes tes requêtes en instanciant uniquement les classes Zend_db_... si les besoins sont simples.

Hors ligne

 

#7 17-05-2009 07:13:21

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

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

Je confirme que c'est completement destabilisant, si il doit y avoir 3 fichiers pour créer un model dont l'un ne sert à faire que des getter et des setters, pourquoi en pas avoir inclu un outil de generation automatique... c'est pas que c'est difficile mais c'est quand meme bien rébarbatif et il n'y a rien de tel pour démotiver un dev que de lui imposer de faire des choses aussi répétitives que d'écrire des bouts de codes aussi répétitifs que ça?

Hors ligne

 

#8 18-05-2009 09:53:19

kreatik
Membre
Date d'inscription: 14-04-2009
Messages: 26

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

Je pense qu'on est pas obliger de surcharger les getter et setter et donc pas obligé de créer ces fichiers, je commence a comprendre un petit peu c'est vraiment super smile

Hors ligne

 

#9 31-05-2009 12:12:43

Guillhomme
Membre
Date d'inscription: 09-10-2008
Messages: 102

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

J'ai beau chercher dans la doc, google, je trouve pas comment generer un model sad

J'ai essayé :

Code:

zf.bat create model toto

Ca me dit qu'il comprend pas "model" sad

Comment vous faites ? smile

Hors ligne

 

#10 31-05-2009 12:38:41

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

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

oui effectivement le quick start par enfin du modèle

si on se réfère aux premières versions on peut dire que ZF était un frame work VC fournissant de quoi construire un modèle. Mais il n'y avais rien dans le framework concernant le modèle en tant que tel
ZF fournissait les brique pour le construire mais pas pour l'encadrer

aujourd'hui ZF propose un cadre pour le modèle et du coup la doc explique ce cadre.

comme toujours dans ZF c'est du facultatif. donc tu n'est pas obligé d'utiliser la totalité du cadre. mais il est évident que si ZF veut que ce cadre soit adopté il faut expliquer comment l'utiliser et montrer sa portée.

je constate au fil des version que les manque que j'avais trouvé dans les premières se comblent peu à peu
A+JYT

Hors ligne

 

#11 31-05-2009 13:31:01

Guillhomme
Membre
Date d'inscription: 09-10-2008
Messages: 102

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

Justement je voudrai m'en servir, mais je ne trouve pas comment le créer via la commande sad

Hors ligne

 

#12 31-05-2009 13:36:28

kreatik
Membre
Date d'inscription: 14-04-2009
Messages: 26

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

Salut, tu ajoutes le repertoire contenant zf.bat dans ta variable d'environnement, ensuite en console il te suffira de te placer dans le dossier de ton projet de d'utiliser zend_tools, ex : zf create action test

smile

attention je lis ton dernier post et ne penses pas que ton code sera généré complètement, tu auras juste les fichiers avec des fonctions vides si on peut raccourcir ainsi. Ensuite, à toi de "remplir".

Dernière modification par kreatik (31-05-2009 13:37:59)

Hors ligne

 

#13 02-06-2009 15:25:23

CocoRambo
Membre
Date d'inscription: 23-08-2008
Messages: 17

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

Pour ma part le fait de créer 3 fichiers est une bonne pratique!

- 1 fichier Objet Métier
- 1 fichier de Mapping
- 1 fichier représentant la table (dbTable)

Effectivement le mapper n'a pas grand intérêt si votre objet métier ne manipule ses données que dans une seule table

Maintenant admettons que votre objet métier ne manipule pas une seule table mais plusieurs:

- 1 fichier Objet Métier
- 1 fichier de Mapping
- 2 (ou +) dbTable

Il n'existe toujours qu'un seul objet métier mais celui ci via le mapper va rechercher ses données dans plusieurs dbTable


Voilà comment j'ai interprété le nouveau quickstart! Certes plus de fichier, mais également plus de flexibilité!

Hors ligne

 

#14 02-06-2009 19:07:24

kreatik
Membre
Date d'inscription: 14-04-2009
Messages: 26

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

Ah pas mal cette reflexion tu as pas un petit peu de code pour illustrer tout ça ?

Hors ligne

 

#15 03-06-2009 18:41:27

CocoRambo
Membre
Date d'inscription: 23-08-2008
Messages: 17

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

Je vais essayer de trouver le temps et d'en faire un petit schema wink

Hors ligne

 

#16 03-06-2009 22:26:47

kreatik
Membre
Date d'inscription: 14-04-2009
Messages: 26

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

Merci beaucoup, vraiment !

Hors ligne

 

#17 10-06-2009 10:12:25

sphax3d
Membre
Lieu: Calais, France
Date d'inscription: 14-05-2008
Messages: 12
Site web

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

En effet, l'explication simple de CocoRambo me fait un peu ouvrir les yeux sur l'intérêt de ces trois fichiers qui représentent la partie Model pour un objet métier. Merci :-)
Cependant, j'ai encore un peu de mal à définir ce qu'est un objet métier. Je ne vois pas vraiment à quoi peuvent correspondre les objets métier dans mes applications, où retrouver un élément tel que l'objet Guestbook du Quickstart.

Hors ligne

 

#18 10-06-2009 11:46:10

kreatik
Membre
Date d'inscription: 14-04-2009
Messages: 26

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

Le petit schéma se fit attendre wink

Hors ligne

 

#19 16-06-2009 10:37:58

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

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

Pour appuyer ce que dit CocoRambo :

Les données et les objets métiers sont deux choses distinctes.

Supposons qu'on ai une table Magasin, une table Produit, et une table Stock (relation N-N classique entre Magasin et Produit). Notre modèle de données a donc trois objets Magasin, Produit et Stock.
Le modèle métier, lui n'a que deux objets : Magasin qui contient dans un attribut "stock" un tableau de produits, et Produits.

Vous allez me dire : ok, on peut consulter les stocks d'un magasin facilement, mais consulter les magasins ayant en stock un certain produit devient long. Justement, c'est un modèle métier, donc il faut l'orienter selon le besoin de l'utilisateur. Ici on considère que le besoin c'est surtout de voir les stocks d'un magasin.

On voit donc que l'objet magasin sera construit à partir des tables Magasin, Stock, et même Produit (il faut tout obtenir d'un coup avec des jointures). Le Mapper est là pour interroger la base de la bonne façon (avec la jointure) puis construit les objets Produit et l'objet Magasin qui les contient.

Voilà un exemple d'utilisation de Mapper. Je suis d'accord que ce n'est pas forcément utile pour une petite application, mais je trouve bien que le quick start l'introduise malgré tout (ça ouvre l'esprit, j'ai beaucoup appris sur les bonne pratique justement grâce aux différents quick starts du ZF, et en creusant les concepts qu'ils proposent).

Enfin, un petit bémol : à priori Zend_Db_Table n'est pas prévu pour les requêtes avec jointures vers d'autres tables liées... je me trompe peut être mais vous pouvez regarder mon autre post à ce sujet : http://www.z-f.fr/forum/viewtopic.php?id=3401.

Voilà, j'espère que ça aide. Désolé si j'ai pas fait un petit schéma en passant, mais j'espère que c'est clair quand même !

Dernière modification par ramos (16-06-2009 10:39:22)

Hors ligne

 

#20 19-06-2009 08:50:28

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

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

ramos ton exemple parait intéressant même si ca reste plus ou moins clair dans mon esprit.
Te serais tu possible de traduire tout ça en code afin de bien appréhender le concept sans mauvaise interprétation ?
Au vu des 3/4 derniers post le sujet dans ce forum, le mapper fait débat et reste vraiment très flou et pas évident à appréhender, donc un bon gros exemple bien concret ce serais vraiment cool pour tout le monde smile

Donc avis aux experts du model et de l'approche mapper.

Dernière modification par Moimeme (19-06-2009 09:00:02)

Hors ligne

 

#21 19-06-2009 10:16:53

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

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

Malheureusement Moimeme, ça ne fait que 4 jours que je planche sur le sujet donc mon code n'est pas encore fait. D'autre part, le Zend Framework a le défaut de ne pas proposer de Mapper abstrait qui permettrait de créer facilement plein de Mapper en héritant du leur...

Bref, pour le moment, je ne peux que te conseiller de bien regarder le code du Quickstart de Zend Framework section Model and Database.

Pour information, j'essaye en ce moment de faire mon propre Mapper abstrait en m'inspirant un peu de Hibernate (ça ne m'amuse pas de réécrire le même code dans tous mes mappers). Dès que ça aboutit je donnerais mon code ici. En attendant, pour créer des Mappers je m'inspire du GuestBookMapper du quickstart.

Hors ligne

 

#22 19-06-2009 10:36:43

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

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

J'avoue que pour moi leur exemple est pas du tout parlant car il est basé sur une seul table et donc je vois carrément pas l'utilité du mapper et comment le porter sur des objets métiers complexes.
En revanche, quand ton objet métier est basé sur plusieurs table cela doit clairement être intéressant mais j'avoue ne pas bien voir comment réaliser la répartition du code entre le model et le mapper.

Hors ligne

 

#23 19-06-2009 12:14:35

pinouf
Membre
Date d'inscription: 05-09-2008
Messages: 41

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

j'ai également le même problème... quand on veut utilisé plusieurs tables je ne sais pas ou mettre le code métier....

Hors ligne

 

#24 19-06-2009 23:20:00

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

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

Je vais donner un exemple avec deux tables. Tout d'abord, je pense qu'il ne faut pas résonner en terme de table en premier, mais en terme de métier.
Vous avez des auteurs et des livres. Un livre a un seul auteur, un auteur peut écrire plusieurs livre.
Vous allez écrire 2 classes métier : Model_Author et Model_Book.
Ensuite, il faut faire la couche de persistance. Ici facile, 2 tables, la table TB_BOOK a une référence vers TB_AUTHOR.
Maintenant on va faire le ou les mapper.
Cas 1 : vous aurez besoin de récupérer parfois des auteurs sans les livre, et aussi les livres et leurs auteurs -> deux Mappers ce sera bien, un pour opérer sur les livres (et leurs auteurs), un pour opérer sur les auteurs (un peu sur leurs livres aussi si besoin).
Cas 2 : vous n'utilisez jamais les auteurs indépendamment des livres : pas besoin de s'embêter avec 2 mapper, un BookMapper suffira.

Et à quoi sert le ou les Mappers ? Ils permettent de construire les objets métier à partir des requêtes, et d'insérer de nouveaux enregistrement à partir des objets métier.
Ok, mais ça, Zend_Db_Table et Zend_Db_Table_Row me donnent la même chose.
En fait non, pas pour les jointures. La votre BookMapper pourra vous renvoyer la liste de tous les livres associés à leur auteur, à chaque fois sous la forme d'un Model_Book $book tel que $book->author (ou $book->getAuthor()) soit le Model_Author qui va bien.

Le code métier sera toujours dans le contrôleur. Le Mapper gère les jointures et renvoie bêtement les objets qu'on lui demande. Les Zend_Db_Table peuvent gérer l'intégrité des données en base (genre vérifier que le format de telle date correspond bien au format attendu), mais c'est tout. Le métier c'est pour la partie contrôleur, et le Mapper, c'est dans le modèle.

Ensuite on peut compliquer : s'il y a deux sortes de livre (recueil de nouvelles et romans supposont) avec des attributs différents, vous allez créer des objets métier Model_Roman et Model_Nouvelle qui hériteront de Model_Book. Par contre vous garderez probablement un seul Mapper BookMapper et choisirez une des trois techniques connues pour faire de l'héritage en base de donnée.

Voilà, bonne soirée, j'espère que c'est un peu plus clair !

Hors ligne

 

#25 23-06-2009 22:14:35

sphax3d
Membre
Lieu: Calais, France
Date d'inscription: 14-05-2008
Messages: 12
Site web

Re: [Zend_Db][Zend 1.8.0] Modèle, Quickstart et Usine à gaz

Salut à tous,

Je suis content que la discussion autour de la gestion du Model continue car on a encore du travail, je pense, pour comprendre comment utiliser au mieux Zend_Db.

Merci ramos pour ton exemple intéressant et bien expliqué, ça m'a motivé pour le coder histoire qu'on se rende compte de ce que ça donne, en utilisant un code organisé comme dans le Quick Start. J'ai choisi de développer le cas 1 que décrit ramos pour avoir d'un côté une liste d'auteurs, avec les livres qu'ils ont écris et de l'autre une liste de livres avec comme attribut leur auteur.

Mon application d'exemple est disponible à l'adresse http://bearnaise.net/~sphax3d/model-mapper-table.zip
Il faut regarder en particulier les fonctions fetchAll() et findByAuthor() dans BookMapper.php et AuthorMapper.php

Je suis bien sûr ouvert à toutes contributions pour améliorer cet exemple, en particulier pour rajouter des fonctionnalités intéressantes à implémenter avec cette organisation de trois fichiers par modèle :-) N'hésitez pas à proposer votre version de cette application d'exemple !

Quelques points encore obscurs pour moi :
- Quand ramos parle de "raisonner en terme de métier" auteurs et livres paraissent correspondre à des types de données, et pas à une "fonction" comme le Guesbook du Quick Start. Ces données seront donc des tables au niveau du stockage en BDD, donc je ne vois pas encore la différence... où alors j'ai mal compris :-)
- Je trouve que les fonctions __construct(), __set(), __get() et setOptions(), voire aussi les getter et les setter, dans les fichiers models/Author.php et models/Book.php, n'ont pas leur place dans ce fichier de modèle. D'après moi, elles permettent de faire fonctionner le modèle et n'ont pas d'intérêt à être répétés dans chaque fichier de modèle. Pourquoi ne pas créer un composant Zend_Model avec ces fonctions ? Ainsi chaque modèle étendrait cette classe... (un peu trop d'ambition ? :-))
- Pareillement, les fonctions setDbTable() et getDbTable() ne permettent que de faire fonctionner la structure des trois fichiers Model / Mapper / Table et donc n'ont rien à faire dans un fichier AuthorMapper.php ou ou BookMapper.php. Là encore je verrais plutôt ces fonctions dans une class Zend_Model_Mapper ou Zend_Model_DbMapper pour avoir plusieurs types de mapper... Enfin pour ça, c'est une simple idée, qui n'est peut-être pas bonne :-)
- Quel est l'intérêt d'avoir plusieurs mappers pour un modèle ? (setMapper() et getMapper())

En tout cas, je ne suis pas encore convaincu de cette solution Model/Mapper/Table. J'utilisais avant une solution du style Model/Table/Row qui convenait assez bien. J'appelais dans mon controller les fonctions définies dans une classe Model qui elles même appelaient les fonctions d'une classe Table (héritant de Zend_Db_Table_Abstract), pour par exemple utiliser find(), ou les fonctions d'une classe Row (héritant de Zend_Db_Table_Row_Abstract) pour par exemple définir l'attribut d'un seul élément (row).

Merci pour vos réponses !

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