|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre confirmé
![]() Inscription : avril 2005 Messages : 421 ![]() |
Bonjour à tous,
Existe il un générateur sérieux PHP de Model en PHP pour Zend_db soit à partir d'un schéma de base existant ou bien d'un XML ? Si non est ce une idée pertinente d'en écrire un ? |
|
|
00
|
|
|
#2 | ||
|
Membre confirmé
![]() ![]() Lucas CORBEAUXChef de projet MOE Inscription : février 2003 Messages : 158 ![]() |
C'est une très bonne question, que je me pose moi même depuis quelques temps. Générer un Model et un Data Mapper est quelque chose de compliqué, qu'il est impossible d'automatiser à 100%.
Pourtant, ça prends énormément de temps à créer initialement avec beaucoup d'éléments répétitifs... Je ne peux pas t'aider pour ce qui est de savoir si une solution correcte existe pour générer les modèles, je n'ai pas encore cherché, même si à ma connaissance les générateurs se bornent souvent à générer des objets fortement liés à une base de données (principalement des ActiveRecords), et on s'éloigne de ce que je recherche. Par contre, j'ai hier soir (les grands esprits se rencontrent ) créé un petit prototype de générateur de modèle qui utilise un Zend_Db_Table_Abstract et qui donne rapidement un résultat assez satisfaisant.Il manque encore (au moins) deux choses fondamentales : - Externaliser les algorithmes de normalisation des membres du modèle par rapport aux champs de la base. L'externaliser sous forme d'une Stratégie permettrait de plus facilement personnaliser les règles de nommage et de les adapter au cas par cas. - Externaliser la gestion du typage, car pour ma part un modèle doit être fortement typé et forcer un cast pour les types natifs (int, string, bool...) ou une définition de méthode typée pour les objets dans ses méthodes set*. Je pense qu'il faut l'externaliser car personnellement je fournis les champs de type date d'une base de données dans un objet Zend_Date pour les modèles, ce qui facilite l’interaction application / data layer, mais ça peut ne pas convenir tout le temps, et encore moins à tout le monde (surtout sur le plan des performances). A mon avis ce genre d'outils n'a d'utilité qu'en création pour gagner un peu de temps : elle implique après coup tellement de réécriture (relation entre modèles, cas où les modèles et les tables ne correspondent pas 1 à 1, nommage à adapter à cause d'une base mal nommée...) qu'une fois le modèle finalisé il ne peut plus "évoluer" grâce à cet outil si la table change, il faudra tout faire à la mano. Voici le code de la classe, je suis preneur de tout avis bien évidemment , mais si l'outil peut être utile (et si la roue n'a pas déjà été inventée ailleurs) ça vaut le coup d'approfondir le concept et d'étendre Zend_Tool pour l'exploiter en ligne de commande.Code :
|
||
|
00
|
|
|
#3 | |||
|
Membre confirmé
![]() Inscription : avril 2005 Messages : 421 ![]() |
Merci beaucoup pour ta réponse,
Citation:
Mon souhait est d'avoir quelque chose qu'y se rapproche d'Hibernate dans la génération des objets proxy. Ce type d'outils permet :
Citation:
Citation:
Si par chance ce ne sont que ajout de colonnes ça passe comme une lettre à la poste. Si c'est autre chose ça fera toujours du temps de gagner. [hors sujet]: Pour l'application je trouve que c'est plus pratique de lancer sous Apache pour faire des rapport Web et debugger et pas en standalone. |
|||
|
|
00
|
|
|
#4 | ||||
|
Membre confirmé
![]() ![]() Lucas CORBEAUXChef de projet MOE Inscription : février 2003 Messages : 158 ![]() |
Citation:
C'est une question très "naïve", je n'ai pour ma part pas encore eut le temps de m'y "plonger" pour voir si il permettait de faire ce que je cherche, mais de loin ça ne m'a pas paru être le cas. Par contre pour le coup, je ne pense pas que Zend_Db puisse être considéré comme un ORM : il fournit "simplement" une interface d'accès à une base de donnée via Zend_Db_Adapter et une implémentation d'un Table Data Gateway avec Zend_Db_Table, laissant le développeur libre de ses propres choix en terme de mapping. Citation:
Citation:
Dans ce contexte, ça me paraît dangereux de re-générer les modèles une fois le premier travail de mapping terminé... Surcharger les modèles systématiquement me paraît aussi assez "dangereux" : explosion du nombre de classes, complexité accrue et... même de perte de temps, au final. Mais bon, je pense que c'est une question de sensibilité personnelle plus qu'autre chose, et ça ne change pas le besoin de base : générer les modèles... Citation:
J'essaye de bricoler un prototype plus aboutis ce week-end car je vais rapidement avoir besoin d'une solution viable pour divers projets. |
||||
|
00
|
|
|
#5 | |
|
Membre confirmé
![]() Inscription : avril 2005 Messages : 421 ![]() |
Citation:
Doctrine est lui un ORM et est plus proche d'hibernate et par conséquent c'est nettement plus proche de que je voudrais. Par contre je n'ai pas trouvé de fonction de retro création à partir d'un schéma existant. Etant donné que je n'ai jamais utilisé doctrine je ne me suis pas étendu fortement en recherche sur le sujet. Le souci avec Doctrine c'est que dans Zend Framework 1.X n'a pas d' "adapter" pour Doctrine du coup plein de classe de Zend Framework ne peuvent l'utiliser nativement. Je prend l'exemple de Zend_Paginator il prend en paramètre un Select de Zend_db et pas Doctrine. A priori dans ZF2 ce sera possible (au conditionnel). |
|
|
|
00
|
|
|
#6 | |||||
|
Membre confirmé
![]() ![]() Lucas CORBEAUXChef de projet MOE Inscription : février 2003 Messages : 158 ![]() |
Citation:
J'ai travaillé un peu sur le sujet, et j'ai désormais un résultat acceptable, bien entendu à éprouver sur des conventions de nommage différentes... A partir de la table suivante, issue d'un projet perso : Code :
Code :
|
|||||
|
00
|
|
|
#7 | ||||||
|
Membre confirmé
![]() Inscription : avril 2005 Messages : 421 ![]() |
Merci pour l'exemple.
Oui un dépôt Github ce serait pas mal j'ai déjà essayé ton code pour générer et ça fonctionne bien. J'aimerais bien lui ajouter une fonction de Mapping avec une DbTable associé. Dans mon idée était de commencer par générer toutes les Dbtable de la base. J'ai fait les test sur Mysql. J'ai fait une classe SchemaGenerator qui lit un schéma de base et qui génère (via DbTableGeneratorAbstract.php) des fichiers qui hérite de Zend_Db_Table pour chaque table dans la base. Le fichier est NomdeletableAbstract.php. Ensuite via DbTableGenerator.php si le fichier n'existe pas un fichier prêt à recevoir le code à ajouter est ecrit. Il hérite de la classe Abstract correspondant. Voir pièce jointe pour le fichier. La gestion est très light. ça donne ça pour une table 'table2' Code :
Ensuite ajout la variable _name et _primary. Pour _primary il utiliser les constante généré et gére 0 à N clef. Code :
Code :
|
||||||
|
|
00
|
|
|
#8 | ||
|
Membre confirmé
![]() ![]() Lucas CORBEAUXChef de projet MOE Inscription : février 2003 Messages : 158 ![]() |
Bonsoir, et merci pour ces exemples. Concernant la génération de DbTable à partir de la base, je ne m'étais pas penché dessus encore car pour moi ça représentait une bien moins grande charge de travail que les Domain Model, mais il n'y a pas de petit profit
![]() L'idée de séparer les classes générées des classes finales est intéressante, mais en fait ça me met le doute quant au fait que l'on ait en tête la même architecture. De mon côté je vois assez peu d'intérêt à rajouter du code personnalisé dans les DbTable : ceux-ci ne servent que d'interface de communication avec la base de données, et tout le code métier se trouvera externalisé dans les Domain Model, tandis que le mapping base / modèle sera géré par les Data Mapper. J'ai plus l'impression que tu envisages des objets DbTable plus "gros" chargés de récupérer les données et de les mapper, je me trompe ? Quoi qu'il en soit, j'ai créé le dépôt Github : https://github.com/lucascorbeaux/Zend_Db-ModelGenerator J'ai d'ailleurs trouvé des projets similaires sur Github, mais apparemment sans gros suivi. Si tu veux je peux te mettre contributeur si tu as des propositions à faire directement dans le code. Ca reste un prototype, du coup c'est très légèrement documenté... Voici un code d'exemple : Code :
zf create db-table ClassName table_name |
||
|
00
|
|
|
#9 |
|
Membre confirmé
![]() Inscription : avril 2005 Messages : 421 ![]() |
Je voudrais générer le Mapper et les objets basique représentant une ligne d'une table. Faire le cheminement inverse de cette doc.
Avec en plus des constantes pour aider à l'écriture des requêtes. Dans la limite de la doc que j'ai lu les outils ZF ne permette pas la génération à partir de la table existante. http://framework.zend.com/manual/fr/...ate-model.html |
|
|
00
|
|
|
#10 | ||
|
Membre confirmé
![]() ![]() Lucas CORBEAUXChef de projet MOE Inscription : février 2003 Messages : 158 ![]() |
Désolé pour ma réponse 3 jours après, début de semaine un peu difficile...
En tout cas maintenant je sais qu'on cherche bien une solution au même problème En effet, le Zend Framework ne permet pas de générer les tables autrement qu'une par une, par contre ça ne devrait pas être difficile de composer autour : Code :
|
||
|
00
|
|
|
#11 |
|
Membre confirmé
![]() Inscription : avril 2005 Messages : 421 ![]() |
Pour ma part j'ai implémenté la génération du _metacache (il suffit de faire une dump de la table info)dans la génération ce qui m'a permis de passe de 3sec à 0 sec sur certaines requêtes.
ça c'est plutôt pas mal J'ai fait la génération des Model Objet Abstract qui appel les Abstracts tables et les implémentation des tables correspondantes mais sans Classe Mapper. Les model objets font leur mapping avec des ROW en utilisant les constantes mais j'ai fait ça vite fait pour gérer une urgence. Je pense qu'il faudrait que repenser une partie de ce point. En plus j'ai fait l'ajout des TAGS SVN. |
|
|
00
|
|
|
#12 | |
|
Membre confirmé
![]() ![]() Lucas CORBEAUXChef de projet MOE Inscription : février 2003 Messages : 158 ![]() |
Citation:
De mon côté, j'ai finis un premier prototype : https://github.com/lucascorbeaux/Zend_Db-ModelGenerator Très peu (et très mal) testé, mais globalement il arrive à générer dbTable, modèles et mappers simplement en configurant un projet Zend Framework et en exécutant le script generateModels.php. Il n'arrive pas pour le moment à gérer automatiquement les Zend_Date au niveau du mapper et ne sait pas traiter les clés primaires composites, mais ça reste un prototype. Pour le moment, je vais lâcher mon clavier et (re)commencer à me poser des questions : Un outil de génération à usage "ciblé" devrait se faire rapidement, mais ça n'intéressera pas grand monde à part moi Beaucoup plus compliqué par contre de penser à un outil de génération configurable et réutilisable, ne bloquant pas les utilisateurs pour des applications spécifiques (séparation optionnelles des classes générées abstraites et de leurs implémentations concrètes, conventions de nommage, tags SVN) tout en fournissant une implémentation minimale mais fonctionnelle. Et d'autres encore, les méthodes fromArray et toArray pourraient par exemple être gérées par une classe parente, et devraient donc ne pas être générées dans les modèles. Bref, beaucoup de questions à se poser... |
|
|
00
|
|
|
#13 | |
|
Membre confirmé
![]() Inscription : avril 2005 Messages : 421 ![]() |
C'est pas mal. tu es allé plus loin que moins sur les méthodes et les mappers.
Pour la gestion des dates j'ai du faire une appel à une fonction de traitement qui convertit entre la DB et et ZENd il faut pouvoir appeler une fonction perso selon le format de date utilisé. J'ai déja commencé à utiliser mon generator et les méthodes fromArray et toArray sont très utile comme par exemple reprendre en direct les values d'un Form. Par contre la manipulation des Zend_DbTable_Row que j'ai faite ne me convient pas à l'usage. Citation:
J'ai rendu le code utilisable entre mes différents projets ZF en utilisant des héritages dynamiquement générer mais ça fait beaucoup de niveau d'héritage au final ce qui va à l'encontre du principe de d'avoir un seul descendant. |
|
|
|
00
|
|
|
#14 |
|
Invité(e)
Messages : n/a ![]() |
Bonjour,
Je trouve que c'est intéressant seulement je rencontre quelques difficultés à le faire fonctionner : j'ai d'abord dût mettre les include en dur et lorsque je lance le script il ne me génère que le DbTable avec uniquement le nombre de la table, est-ce normal ? Pour votre aide, Par avance, Merci |
00
|
|
|
#15 |
|
Membre confirmé
![]() Inscription : avril 2005 Messages : 421 ![]() |
Mon code devrait générer 2 classes par Table
une abstract et une autre qui hérite de cette abstract qui doit contenir le code à customisé mais c'est juste une ébauche. En fait il faut ajouter à ces Dbtable la génération du Model_Object qui représente une ligne de la base et faire le jonction avec les 2. |
|
|
00
|
|
|
#16 |
|
Invité(e)
Messages : n/a ![]() |
Sur quel environnement l'avez-vous testé ?
|
00
|
|
|
#17 |
![]() ![]() Ingénieur développement logiciels Inscription : mai 2002 Messages : 3 725 ![]() |
Pour info Doctrine 2 permet de générer une classe entité sur base d'une DB existante : http://www.doctrine-project.org/docs...se-engineering
Ce n'est pas toujours parfait et des fois ça coince, mais il est assez facile d'écrire son propre générateur basique (il restera à retoucher l'entité pour écrire les relations) grâce aux fonctions d'introspection de Doctrine fournies par le SchemaManager que l'on peut obtenir par Doctrine\DBAL\Connection::getSchemaManager(). magnus> Si tu cherches un ORM professionnel du niveau d'hibernate, nul doute que Doctrine 2 est ce qu'il te faut. En plus il n'est pas "ActiveRecord like" comme beaucoup d'autres, il implémente les vrais patterns d'ORM : Data Mapper, Proxy, Unit of work, et compagnie. Il n'est pas encore complètement mûr, mais le sera très bientôt (cf : http://www.doctrine-project.org/docs...wn-issues.html) Il est utilisable avec ZF1, mais il est clair qu'en ZF2 l'intégration de Doctrine sera plus poussée (notamment avec le paginateur comme tu l'avais souligné).
__________________
Tutoriels sur les UPS, e-commerce, PHP, critiques de livres... Ce forum est fait pour vous et surtout par vous, merci d'en respecter les règles. Je n'ai rien à voir avec la société www.ovh.com ! |
|
|
00
|
|
|
#18 |
|
Membre confirmé
![]() ![]() Lucas CORBEAUXChef de projet MOE Inscription : février 2003 Messages : 158 ![]() |
Merci ovh pour ce retour. En effet, de mon côté on a finalement opté pour Doctrine 2 : les fonctionnalités de génération de métadonnées à partir de la base et d'entités à partir des métadonnées dégrossissent une bonne partie du travail mine de rien, et l'ORM réponds à une énorme partie des besoins sans "trop en faire" non plus.
Mon principal (et pour ainsi dire seul) regret est de ne plus pouvoir utiliser Zend_Db_Select, que je trouve bien plus agréable à utiliser que le QueryBuilder de Doctrine (mais c'est un peu cavalier de comparer les deux, le besoin n'est pas le même). Ceci dit une problématique ne change pas : ça reste une option uniquement à la création du projet. Une fois que le projet évolue, re-générer les entités ou le SQL est fortement déconseillé. |
|
00
|
Copyright © 2000-2012 - www.developpez.com