Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Pour résumer la question :
Comment réalisez-vous vos héritage d'objet métier ? Que se soit en base de données ou/et en programmation avec Zend.
Si vous réalisez l'héritage de table avec MySQL en utilisant un système de clé étrangère pour les classes parentes, comment réalisez-vous votre application Zend ?
-----
Après plusieurs jours de lecture autours de ZF, je me suis rendu compte qu'il n'était pas possible de réaliser l'héritage de table avec l'ORM de Zend; du moins, pas simplement.
Mais alors, comment faites-vous ?
Il est très courant au sein des MCD d'avoir de l'héritage, et cet héritage n'est pas toujours intéressant que sur les données, mais aussi sur les traitements.
Prenons l'exemple simple d'un Produit, qui a un titre et un code.
Toutes les classes qui hérite de Produit doivent pouvoir être retrouvé en fonction de leur code.
Si l'héritage de table n'est pas possible avec MySQL, il aurai pu être simulé avec Zend et les DbTable. Cela n'est pas le cas, mais devrai l'être avec Doctrine 2 et donc ZF2 (me trompe-je ?)
Vous avez bien une structure du type
- Model : Produit, Yaourt, Fromage
- Mapper : Produit, Yaourt, Fromage
- DbTable : Produit, Yaourt, Fromage
Grâce à l'utilisation de Vue SQL, et un peu de bricolage dans les Mapper, on peut réaliser l'héritage en lecture facilement. L'écriture étant un peu diffèrent.
Cela se traduit au niveau SQL, par deux tables FromageView et YaourtView qui agrègent toutes deux, Produit/Yaourt et Produit/Fromage en passant par la clé étrangère.
On configure DbTable_Yaourt et DbTable_Fromage pour qu'il ai respectivement comme attribut _name : YaourtView et FromageView.
Au niveau des Mapper, Mapper_Yaourt et Mapper_Fromage appelleront la fonction fillObject (celle qui permet de remplir un Model_Produit à partir d'un Rowset).
Et nous réalisons un héritage de class des Model. Model_Yaourt et Model_Fromage hériteront donc de Model_Produit.
Avec ca, on simule la lecture sur les clés primaires; et on regroupe un bons nombres de fonctionnalités.
Mais QUID de la fonction de recherche par Code qui est commune à tout les produits.
La solution la plus simple, c'est de réaliser cette fonction au sein des Mapper et des DbTable de chaque type d'objet... Mais bon, c'est affreusement moche et surtout lourd à maintenir.
Et vous, vous faites comment ?
Dernière modification par armetiz (08-03-2010 11:32:09)
Hors ligne
pourquoi tu dit qu'on peut pas faire d'héritage c'est de l'objet comme d'autre LOO
pourquoi tu fais pas DbTable_Yaourt extends DbTable_Produit et DbTable_Fromage extends DbTable_Produit ?
c'est simple est ça fonctionne.
perso j'ai la structure suivante
Zend_Db_Table
Fast_Db_Table (classe table commune à toutes mes applications c'est là que je capitalise d'une appli sur l'autre)
Application_Db_Table (classe de base pour les tables de mon application)
Module_Db_Table (une par module qui capitalise les éléments commun aux table d'un module)
et ensuite en fonction du modèle les table du modèle et l'héritage issue de la modélisation métier
si j'ai une méthode commune aux tables d'un module je la mets dans la classe Module_Db_Table correspondante si la méthode est commune à plusieurs tables au travers de toute l'application c'est dans
Application_Db_table que je la mets. et si j'estime que c'est suffisamment portable et intéressant pour être reporté sur d'autres application je le mets dans Fast_Db_Table ainsi toute mes futures applications en profitent.
et si je pense que cela intéresse la communauté je fais une proposition d'évol à ZF en attendant qu'elle soit intégré ou rejeté je le laisse dans Fast_Db_Table.
lorsque ZF évolue je réadapte Fast_Db_Table pour en tenir compte.
Je suis assez étonné de voir le nombres d'artifices mis en oeuvre dans ZF pour ne pas faire d'héritage. alors que souvent il suffit de dériver une classe de base pour faire ce qu'on veut de façon simple.
A+JYT
Hors ligne
Merci de ta réponse,
Malheureusement, je n'arrive toujours pas à voir comment...
J'ai essayé de réaliser l'héritage sur les DbTable et donc d'avoir DbTable_Yaourt extends DbTable_Produit et DbTable_Fromage extends DbTable_Produit.
Dans DbTable_Fromage il y aura la propriété "_name" qui contiendra le nom de la table "Fromage". Au niveau de MySQL, l'héritage de table n'est pas possible. Cela implique la chose suivante :
Si l'on prend la class DbTable_Fromage avec juste l'extends DbTable_Produit, et que l'on utilise la fonction insert (), l'insertion se fera alors dans la table Fromage mais pas dans la table Produit, de plus nous aurons une exception de levée pour les données de produit qui ne sont pas connues au sein de Fromage.
Et c'est ici que je bloque... Car je sens qu'il y a un truc a faire mais je ne comprends pas quoi..
Pour en revenir à ta structure (car je rappel que je débute), tu aurai donc eu un Module "Produit" ?
Dans l'attente de tes nouvelles,
Thomas.
Hors ligne
effectivement tu ne peut pas faire un héritage dans mySQL comme on le fait avec postgreSQL si tu utilise une relation entre les table produit yaourt et fromage pour faire de l'héritage ZF ne te permet pas directement de le gérer. il faut pour cela surcharger les méthodes insert et update de Zend_Db_Table pour les remplacer par la transaction SQL appropriée.
A+JYT
Hors ligne
Ah cool, je ne suis pas trop loin de la réalité fonctionnelle :p
Je vais continuer de lire encore - et encore - de la documentation Zend pour comprendre un peu mieux ta démarche.
Merci de tes réponses en tout cas.
Cdt,
Thomas.
Hors ligne
J'ai modifié le 1° post et son titre.
Car je ne pense pas que se soit une question anodine, surtout que Zend a pour vocation de structurer le développement d'application PHP.
Pour résumer la question :
Comment réalisez-vous vos héritage d'objet métier ? Que se soit en base de données ou/et en programmation avec Zend.
Si vous réalisez l'héritage de table avec MySQL en utilisant un système de clé étrangère pour les classes parentes, comment réalisez-vous votre application Zend ?
Hors ligne
Bonjour, je me permet de déterrer cette question car elle n'a toujours pas été répondue, donc : Si vous réalisez l'héritage de table avec MySQL en utilisant un système de clé étrangère pour les classes parentes, comment réalisez-vous votre application Zend ?
Cordialement
Hors ligne
Pareil ! je cherche exactement la même chose ces derniers jours !
avez-vous des mots clef ? ou exemple ?
car je n'arrive pas a représenter sa correctement a la fois en BDD et avec ZF 1;
Hors ligne
Je ne sais pas pour Zend à proprement parler, mais l'héritage au niveau de Doctrine est implémenté en utilisant un discriminant. Si on a une classe "User", et deux classes "Admin", "Guest" qui héritent de user, la table "User" dispose d'un discriminant qui vaut soit "admin" ou soit "guest", par exemple. Puis si on demande un "Admin", Doctrine fait une jointure au niveau du discriminant.
Après au niveau de Zend\Db je ne sais pas trop, je sais qu'il existe un hydrateur spécialisé qui permet de gérer de manière quasi-automatique les relations entre des entités. Mais Zend\Db a l'air relativement extensible, ça doit être plutôt simple d'ajouter ce cas d'utilisation.
Hors ligne